首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >操作数类型冲突: nvarchar与用户定义的表类型不兼容。

问操作数类型冲突: nvarchar与用户定义的表类型不兼容。
EN

Stack Overflow用户
提问于 2015-10-20 07:50:05
回答 1查看 9.1K关注 0票数 1

我是新来的,目前我遇到了麻烦,我的场景是,我希望将Excel中的数据插入到Server表中并将其更新。

对于insert部分,它工作得很完美,但是当涉及到更新时,我不知道该如何做。我搜索了一些方法,我发现这是使用存储过程对我来说最舒服的方法。

这是我现在使用的代码。当我尝试时,它给了我这个错误:

操作数类型冲突: nvarchar与用户定义的表类型不兼容。

代码语言:javascript
复制
--- Stored procedure ---
CREATE PROCEDURE [dbo].[chkUpdate]
    @Operator IC_CHK READONLY
AS
BEGIN
    set nocount on;

    MERGE INTO tb_Operator c1
    USING @Operator c2 ON c1.IC = c2.IC

    WHEN MATCHED THEN
      UPDATE SET
            c1.Name = c2.Name,
            --c1.IC = c2.IC,
            c1.Email = c2.Email,
            c1.Status = c2.Status,
            c1.Datetime = c2.Datetime

    WHEN NOT MATCHED THEN
      INSERT VALUES(c2.Name, c2.IC, c2.Email, c2.[Status], c2.[Datetime]);
end

--- User-defined table type ---
CREATE TYPE [dbo].[IC_CHK] as table 
(
    [Id] [int] NULL,
    [Name] [nvarchar](50) NULL,
    [IC] [bigint] NULL,
    [Email] [nvarchar](MAX) NULL,
    [Status] [nvarchar](50) NULL,
    [Datetime] [datetime] NULL
)

VS 2010代码:

代码语言:javascript
复制
protected void btnImport_Click1(object sender, EventArgs e)
{
    int i = 0;

    try
    {
        string path = string.Concat(Server.MapPath("~/Excel/" + UploadExcel.FileName));
        UploadExcel.SaveAs(path);

        String strCon = string.Format("Provider=Microsoft.Ace.OLEDB.12.0;Data Source={0}; Extended Properties=Excel 12.0;",path);
        OleDbDataAdapter myda = new OleDbDataAdapter("SELECT * FROM [sheet1$]", strCon);

        DataTable myds = new DataTable();
        myda.Fill(myds);

        for (i = 0; i <= myds.Rows.Count - 1; i++)
        {
            String constr = ConfigurationManager.ConnectionStrings["conn"].ConnectionString;

            using (SqlConnection con = new SqlConnection(constr))
            using (SqlCommand cmd = new SqlCommand("chkUpdate"))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Connection = con;

                cmd.Parameters.AddWithValue("@Operator", path);

                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();
            }
        }

        MsgBox1.alert("Import success");
        View.Visible = true;

        vBinds();
    }
    catch (Exception ex)
    {
        MsgBox1.alert(ex.Message);
    }
}

帮我查一下,我很感激。谢谢

P/S:我再次确认我的用户定义的表类型与我的表具有相同的数据类型。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-20 08:12:00

在INSERT中的MERGE语句中,我建议显式地定义要插入的列。最有可能的是,这是错误的原因--您正在插入列--但是您没有指定应该插入哪些目标列。

由于您是而不是指定的,所以必须按照定义它们的确切顺序为表中的每列提供值--真的是这样吗?例如,在表中的ID列中插入了什么??

假设实际数据库表上的ID列是IDENTITY列,我将使用(否则,您必须在要插入的列列表中列出ID,并在值的VALUES列表中提供一个值):

代码语言:javascript
复制
WHEN NOT MATCHED THEN
  INSERT(Name, IC, Email, [Status], [DateTime])
  VALUES(c2.Name, c2.IC, c2.Email, c2.[Status], c2.[Datetime]);

我还建议不要使用T保留关键字(如status或datetime )作为您的列名--您这样做只是自找麻烦。使用更有表现力的名称-一些真正与您的业务领域相关的东西-而不仅仅是datetime.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33230940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档