在 SqlDataAdapter.Update() 中获取错误消息

     2023-05-08     173

关键词:

【中文标题】在 SqlDataAdapter.Update() 中获取错误消息【英文标题】:Getting error message in SqlDataAdapter.Update() 【发布时间】:2016-07-14 19:43:38 【问题描述】:

我有一个数据库表(在本例中为空)

create table words
(
    id int not null,
    word nvarchar(50) not null
)

还有一个DataGridView,我是这样填写的:



    private SqlConnection _conn;
    private SqlDataAdapter _wordsAdapter;
    private DataTable _wordsDataTable = new DataTable();
    private DataGridView _tblWords;

    private void FillWords()
    
        _wordsAdapter = new SqlDataAdapter(new SqlCommand("select id, word from words", _conn));
        _wordsAdapter.Fill(_wordsDataTable);

        DataGridViewColumn column = new DataGridViewTextBoxColumn();
        column.DataPropertyName = "id";
        column.Name = "id";
        _tblWords.Columns.Add(column);

        column = new DataGridViewTextBoxColumn();
        column.DataPropertyName = "word";
        column.Name = "word";
        _tblWords.Columns.Add(column);

        _tblWords.DataSource = _wordsDataTable;
    

    private void Update()
    
        _wordsAdapter.InsertCommand = new SqlCommand("insert into words (id, word) values (@id, @word)", _conn);
        SqlParameter p = _wordsAdapter.InsertCommand.Parameters.Add("@id", SqlDbType.Int);
        p.SourceColumn = "id";
        p.SourceVersion = DataRowVersion.Original;
        p = _wordsAdapter.InsertCommand.Parameters.Add("@word", SqlDbType.NVarChar);
        p.SourceColumn = "word";
        p.SourceVersion = DataRowVersion.Original;
        _wordsAdapter.Update(_wordsDataTable);
    

然后我用一些值填充单行 _tblWords 并调用 Update()。并收到此消息:

抛出异常:“System.Data.SqlClient.SqlException”在 System.Data.dll 附加信息:无法将值 NULL 插入列 'id'、表 'DB.MDF.dbo.words';列不允许空值。插入 失败。

为什么 'id' 的值不是从 DataTable 中获取的?我做错了什么?

更新: 在 Update() 函数的开头插入此代码后,一切正常:



    private void Update()
    
        _wordsDataTable.Rows.Clear();
        _wordsDataTable.Rows.Add(0, "xxx");
        ...

所以只有当我通过 DataGridView 填充 DataTable 时才会出现问题。为什么?!

【问题讨论】:

您正在从 datagridview 获取数据并将其插入到表中。 ID 列应该是主键或标识列,因此它不允许您插入重复值。如果要更新表中的单词列,则使用 UPDATE 语句。 表是空的,所以在这种特殊情况下该行是插入的。没有重复,因为插入的行是表中的第一行。但我仍然得到错误。 我正在尝试运行您的代码。_cb 是什么? 对不起,在这个例子中实际上_cb 不是必需的。将其更改为 'new SqlCommand()' 您是否在调试器中查看过此内容并检查数据表中是否有值? 【参考方案1】:

我猜测问题与 DataGridView 中的最后一个空行有关。

您可以尝试这样的操作,而不是最后一行 _wordsAdapter.Update(_wordsDataTable);

var haveDbNull = _wordsDataTable.Rows.Cast<DataRow>().ToLookup(r => r.ItemArray.Contains(DBNull.Value));

Debug.Print("have DbNull values: " + haveDbNull[true].Count()); // check this number in the Debug Output window
Debug.Print("don't have DbNull values: " + haveDbNull[false].Count()); 

_wordsAdapter.Update(haveDbNull[false].ToArray());  // to update just the rows that dont have DBNull values

【讨论】:

插入的行没有空值。那就是问题所在。当我通过 DataGridView 按值插入它时,出现错误。当我以编程方式将其插入 DataTable 时,一切正常。 我不知道你为什么使用p.SourceVersion = DataRowVersion.Original;。您应该删除它们或将它们更改为 p.SourceVersion = DataRowVersion.Current; msdn.microsoft.com/en-us/library/system.data.datarowversion 我也尝试了 Current,结果相同。如果我完全删除它,还会出现另一个错误,说没有提供参数值。问题是它从 DataTable 中获取 null 值而不是当前值。 那我放弃了.. 你可以试试csharp.net-informations.com/dataadapter/… 的示例,然后从那里开始【参考方案2】:

我找到了一些解决方案。我只是删除添加的行并以编程方式添加相同的值。



    object[] rowValues = dt.Rows[row].ItemArray;
    dt.Rows.RemoveAt(row);
    dt.Rows.Add(rowValues);

有谁知道不那么丑陋的方法吗?

【讨论】:

【参考方案3】:

解决方法一如既往的简单……


    _dtWords.EndInit();

【讨论】:

SqlDataAdapter.update() 不更新数据库

】SqlDataAdapter.update()不更新数据库【英文标题】:SqlDataAdapter.update()notupdatingdatabase【发布时间】:2015-04-0704:22:47【问题描述】:我正在使用SqlDataAdapter在PostLikes表中搜索(PostId,UserId),如果找到该行,我正在使用SqlCommandBuilder.GetDelet... 查看详情

C# SqlDataAdapter.Update()

】C#SqlDataAdapter.Update()【英文标题】:【发布时间】:2010-07-1208:39:42【问题描述】:我要疯了。我做了ff:创建数据表。通过SqlDataAdapter从SQL数据库填充它。通过datagridview编辑数据表。调用sqldataadapter.update但更改不会持久化到数据... 查看详情

SqlDataAdapter.Update 未更新

】SqlDataAdapter.Update未更新【英文标题】:SqlDataAdapter.Updatenotupdating【发布时间】:2015-10-2119:34:29【问题描述】:(我应该说我对vb.net相当陌生)我在覆盖我的数据库中的条目时遇到问题。我认为问题在于SqlDataAdapter.Update没有用我... 查看详情

当 RowState = Modified 时 SQLDataAdapter.Update() 不更新

】当RowState=Modified时SQLDataAdapter.Update()不更新【英文标题】:SQLDataAdapter.Update()notUpdatingwhenRowState=Modified【发布时间】:2018-05-1516:41:39【问题描述】:我正在尝试设置一个程序,当用户更新项目描述时,将在保存表单时更新数据库... 查看详情

SqlDataAdapter.Update(数据表)不工作(不更新数据库)

】SqlDataAdapter.Update(数据表)不工作(不更新数据库)【英文标题】:SqlDataAdapter.Update(datatable)isnotworking(notupdatingthedatabase)【发布时间】:2016-04-0516:34:30【问题描述】:我有下面的代码,我试图从Windows应用程序中所做的c#网格视... 查看详情

200万条记录的SqlDataAdapter.Update()速度极慢

】200万条记录的SqlDataAdapter.Update()速度极慢【英文标题】:SqlDataAdapter.Update()of2millionrecordsisextremelyslow【发布时间】:2019-04-3009:22:51【问题描述】:我有一个客户希望每天将他的子客户价格工具(超过2.000.000条记录)导入SQLServer数... 查看详情

使用 SqlDataAdapter.Update 方法时复制表行

】使用SqlDataAdapter.Update方法时复制表行【英文标题】:DuplicatingtablerowswhenusingSqlDataAdapter.UpdateMethod【发布时间】:2013-11-0403:08:40【问题描述】:在我的项目中,我有表格“产品”。IDNamePrice------------------1xyz1002abc2003pqr300在我的c#代... 查看详情

SqlDataAdapter.Update(dataset) 方法插入新行但不更新现有行

】SqlDataAdapter.Update(dataset)方法插入新行但不更新现有行【英文标题】:SqlDataAdapter.Update(dataset)methodinsertsnewrowsbutdoesnotupdatesexistingrows【发布时间】:2014-06-0114:56:49【问题描述】:我正在创建具有DataGrigView来呈现表格的winform应用程... 查看详情

SqlDataAdapter.Update 直到第二次更新才写入表

】SqlDataAdapter.Update直到第二次更新才写入表【英文标题】:SqlDataAdapter.Updatenotwritingtotableuntilsecondupdate【发布时间】:2014-08-0201:15:03【问题描述】:我有一个用C#2010Express开发的程序,它的表单由一个DataGridView组成,下面有一个单... 查看详情

如果我将列值“更改”为已经存在的值,会调用 UPDATE 吗?

...需要额外的逻辑来避免对我的SQL数据库的无用调用,或者SqlDataAdapter.Update()是否会做正确的事情。如果我有这个代码:SqlCon 查看详情

Mono C# SQL 更新“并发冲突”

...:2009-07-1015:24:22【问题描述】:每次我尝试通过Mono中的SqlDataAdapter.Update()更新一行时,我都会得到:未处理的异常:System.Data.DBConcurrencyException:并发冲突:UpdateCommand影响了0条记录。 查看详情

datatable数据批量写入数据库三种方法比较

DataTable数据批量写入数据库三种方法比较标签:it 分类:C#1)  insert循环插入;2)  sqldataadapter.update(dataset,tablename);3)  sqlbulkcopy.WriteToServer(datatable);1、生成测试的datatable表,表结构如下:UniqueID(主 查看详情

酒店管理系统无法向数据库插入新的记录,提示列“入住日期”不允许为nulls,急求!!

...,"客人信息表").EndCurrentEdit()'将数据返回数据集SqlDataAdapter2.Update(Ds1,"客人信息表")'更新数据,返回数据源Ds1.Tables("客人信息表").Clear()'以下代码把选择了的房间的"状态"字段更新为"营业中&... 查看详情

c#怎样才能实现客户端通过服务器端连接数据库服务器???

...行解压缩、和反序列化为DataTable7.再将DataTable通过DataSet和SqlDataAdapter.Update(Table)存在SQL中下面我只给一些关键的代码,我有实现过的第一步.客户端==》连接服务器并通讯,主要是发送SQL给服务器返回一个DataTable表usingSystem;usingSystem... 查看详情

秋的潇洒在啥?在啥在啥?

1、秋的潇洒在湖面上空盘旋,在树枝边打转,在风的带动下展现舞姿。2、秋的潇洒在安静的感觉,在丰收的感觉,在凉爽的环境。3、秋的潇洒在晶莹剔透的露珠上,在迎风飘扬的国旗上,在湖边的树林里,在小朋友的欢笑里。... 查看详情

分配的变量引用在哪里,在堆栈中还是在堆中?

】分配的变量引用在哪里,在堆栈中还是在堆中?【英文标题】:Whereisallocatedvariablereference,instackorintheheap?【发布时间】:2010-10-2619:19:07【问题描述】:我有一个问题例如,当我在方法中声明变量时发生了什么。无效我的方法(... 查看详情

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

】在React应用程序中在哪里转换数据-在Express中还是在前端使用React?【英文标题】:wheretotransformdatainReactapp-inexpressoronfrontendwithReact?【发布时间】:2017-11-2403:19:26【问题描述】:我有一个创建联赛的应用程序。我的JSON数据结构如... 查看详情

初始化发生在哪里,在 init 方法中还是在实例声明中?

】初始化发生在哪里,在init方法中还是在实例声明中?【英文标题】:Whereisinitializationtakingplace,intheinitmethodorintheinstancedeclaration?【发布时间】:2015-09-0216:39:26【问题描述】:请不要让我去阅读苹果网站上的链接,因为我已经阅... 查看详情