【问题标题】:Error in DataAdapter.Update() method in C# [closed]C# 中的 DataAdapter.Update() 方法出错 [关闭]
【发布时间】:2012-10-09 16:38:02
【问题描述】:

我正在尝试执行以下插入命令。但它不起作用,也没有显示任何异常。谁能告诉我哪里做错了?

using System;
using System.Data;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Security.Principal;

public partial class StoredProcedures
{
   [Microsoft.SqlServer.Server.SqlProcedure]
   public static void USP_tempSP()
   {   
       DataTable objDataTable = new DataTable();
       using (SqlConnection objConn = new SqlConnection("context connection=true"))
       {
           objConn.Open();
           SqlCommand objCmd = new SqlCommand();
           objCmd.CommandType = CommandType.Text;

           objCmd.Connection = objConn;
           objCmd.CommandText = "select * from temp"; 
           /*table Structure
            *CREATE TABLE [dbo].[temp]([empname] [varchar](20)  NULL,[createdon] [datetime] NULL,[emp_id] [varchar](4) NULL
           ) 
           */
           SqlDataAdapter objDataAdapter = new SqlDataAdapter(objCmd.CommandText, objConn);
           objDataAdapter.Fill(objDataTable);

           SqlCommand objCmd1 = new SqlCommand();
           objCmd1.CommandType = CommandType.Text;
           objCmd1.UpdatedRowSource = UpdateRowSource.None;
           objCmd.CommandText = "Insert into tempCopy " +
                               " values(@empname,@createdon)";
           /*table Structure
            *CREATE TABLE [dbo].[tempCopy]([empname] [varchar](20)  NULL,[createdon] [datetime] NULL
            ) 
           */
           objCmd.Parameters.Add("@empname", SqlDbType.VarChar, 20, objDataTable.Columns["empname"].ColumnName);
           objCmd.Parameters.Add("@createdon", SqlDbType.DateTime, 8, objDataTable.Columns["createdon"].ColumnName);

           SqlDataAdapter adpt = new SqlDataAdapter();
           adpt.InsertCommand = objCmd;
           adpt.UpdateBatchSize = objDataTable.Rows.Count;
           try
           {
               int recordsInserted = adpt.Update(objDataTable);
           }
           catch(Exception ex)
           {
               //
           }

           objConn.Close();
        }
    }
}

【问题讨论】:

  • 你怎么知道它没有抛出异常?您明确地忽略了异常。定义“它不起作用”。你有什么迹象表明它不起作用。观察到的行为与预期行为有何具体差异?这种差异出现在代码的什么地方?发生这种情况时运行时值的状态是什么?
  • 首先,取出catch 块中的注释,并写下/显示任何可能发生的异常,此时您刚刚吞下它。
  • 所以.... 这是通过将Insert 传递给Update 命令并传递一个未更改的表的表副本?还有人困惑吗?
  • 感谢您的即时关注。它不工作意味着程序没有在预期的表 tempCopy 中插入任何内容。我正在研究 CLR 存储过程。我只是想如何将一个表的内容复制到另一个表,它们都有不同的列结构。
  • @Sachin:调试时,插入的值是什么?您能否将 SQL Profiler 附加到数据库并查看针对它执行的实际查询?

标签: c#


【解决方案1】:

我真的认为这是因为您在跟踪其自身更改的表上使用了 update 方法。问题是什么都没有改变。设置AcceptChangesDuringFill = false,以便将行标记为已添加到表中。

       objConn.Open();
       /* This doesn't really do anything.
       SqlCommand objCmd = new SqlCommand();
       objCmd.CommandType = CommandType.Text;

       objCmd.Connection = objConn;
       objCmd.CommandText = "select * from temp"; */
       /*table Structure
        *CREATE TABLE [dbo].[temp]([empname] [varchar](20)  NULL,[createdon] [datetime] NULL,[emp_id] [varchar](4) NULL
       ) 
       */
       SqlDataAdapter objDataAdapter = new SqlDataAdapter("select * from temp", objConn);
       //Make sure we don't mark the new rows as unchanged
       objDataAdapter.AcceptChangesDuringFill = false;
       objDataAdapter.Fill(objDataTable);

       SqlCommand objCmd1 = new SqlCommand();
       objCmd1.CommandType = CommandType.Text;
       objCmd1.UpdatedRowSource = UpdateRowSource.None;
       //This is supposed to be objCmd1 !!
       objCmd1.CommandText = "Insert into tempCopy " +
                           " values(@empname,@createdon)";
       /*table Structure
        *CREATE TABLE [dbo].[tempCopy]([empname] [varchar](20)  NULL,[createdon] [datetime] NULL
        ) 
       */
       //This is supposed to be objCmd1 !!
       objCmd1.Parameters.Add("@empname", SqlDbType.VarChar, 20, objDataTable.Columns["empname"].ColumnName);
       objCmd1.Parameters.Add("@createdon", SqlDbType.DateTime, 8, objDataTable.Columns["createdon"].ColumnName);

       SqlDataAdapter adpt = new SqlDataAdapter();
       //This is supposed to be objCmd1 !!
       adpt.InsertCommand = objCmd1;
       adpt.UpdateBatchSize = objDataTable.Rows.Count;
       try
       {
           int recordsInserted = adpt.Update(objDataTable);
       }
       catch(Exception ex)
       {
           //
       }

       objConn.Close();

我认为这应该可行,您需要更加小心变量命名。 objCmd 相当没有意义。如果命令是 cmdSelectData 和 cmdInsertData 它会更清楚。而且几乎所有东西都是一个对象,所以 obj 只会把代码弄得乱七八糟。

【讨论】:

  • 您好 JamesB,感谢您提供代码 sn-p。我按照您所说的进行了更改。现在我的代码给出了异常,说“消息 =”StatementType 枚举值 4 无效。\r\n参数名称:StatementType “'。它是什么?同时我在谷歌上搜索,如果你知道任何解决方案,热烈欢迎...
  • 我解决了上述错误。原因是“上下文连接中不允许批量更新”。因此我尝试使用连接字符串打开连接,它给了我以下错误System.Security.SecurityException: Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.。你有什么想法关于这个?
  • @Sachin 不是真的,我在标准的 winforms 应用程序中测试了代码,使用连接字符串到 localhost。不过,这里有很多关于该错误消息的问题。 1, 2, 3
  • @JanmesB,我做到了..最后。我只是将 SET permission level 设置为 external 并且它起作用了。谢谢兄弟..
猜你喜欢
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 2014-12-21
  • 2011-09-04
相关资源
最近更新 更多