c# - 位置 (-1) 处没有行 - 尝试保存 DataTable 更改时的 SQL Server
问题描述
我有一个 Windows 窗体数据输入小程序,用于将数据输入到小型 SQL Server 数据库中。AddNewItem
在单击绑定导航器组件上的按钮后尝试保存新记录时,我一直看到此错误。
我单击绑定导航器上的保存按钮的代码如下所示:
private void btnSave_Click(object sender, EventArgs e)
{
try
{
this.Validate();
int currentPosition = this.witsStatusDBDataSet.TestCase.Rows.Count - 1;
WitsStatusDBDataSet.TestCaseRow row = (WitsStatusDBDataSet.TestCaseRow)witsStatusDBDataSet.TestCase.Rows[currentPosition];
row.AcceptChanges();
witsStatusDBDataSet.TestCase.AcceptChanges();
this.testCaseBindingSource.EndEdit();
int current = witsStatusDBDataSet.TestCase.Rows.Count - 1;
testCaseTableAdapter.Update(this.witsStatusDBDataSet.TestCase.Rows[current]);
WitsStatusDBEntry.WitsStatusDBDataSetTableAdapters.TableAdapterManager manager = new TableAdapterManager();
manager.UpdateAll(witsStatusDBDataSet);
SysTimer = new System.Timers.Timer(2500);
statusLabel1.Text = "Updated successfully.";
SysTimer.Start();
}
catch(Exception exc)
{
string msg = exc.Message + " : " + exc.StackTrace;
Clipboard.SetText(msg);
MessageBox.Show(msg);
}
}
如果我在 SQL Server Mgmt Studio 中手动输入数据,绑定导航器会成功加载它,我可以成功使用 Move Next 和 Move Previous。
但是,如果我有一个刚刚部署的全新数据库,没有记录,我会收到此错误。
我检查了 StackOverflow 是否有类似的问题,但似乎没有相同的情况。
解决方案
我根据梅森的评论重新编码了该方法。这是工作代码:
private void btnSave_Click(object sender, EventArgs e)
{
try
{
WitsStatusDBDataSet.TestCaseRow row = null;
this.Validate();
int currentPosition = this.witsStatusDBDataSet.TestCase.Rows.Count - 1;
if(currentPosition == -1)
{
row = AddRowToDataTable(testCase: witsStatusDBDataSet.TestCase);
}
if (row == null)
{
currentPosition = this.witsStatusDBDataSet.TestCase.Rows.Count - 1;
}
row.AcceptChanges();
witsStatusDBDataSet.TestCase.AcceptChanges();
this.testCaseBindingSource.EndEdit();
testCaseTableAdapter.Update(row);
testCaseTableAdapter.InsertCase(row.Title, row.IsAutomated, row.Description, row.State, row.Area, row.Iteration, row.Priority,
row.Severity, row.Owner, row.CreatedDate, row.ModifiedDate, row.TFS_Case_ID, row.TFSInstance);
WitsStatusDBEntry.WitsStatusDBDataSetTableAdapters.TableAdapterManager manager = new TableAdapterManager();
manager.Connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=WitsStatusDB;Integrated Security=True");
manager.UpdateAll(witsStatusDBDataSet);
SysTimer = new System.Timers.Timer(2500);
statusLabel1.Text = "Updated successfully.";
SysTimer.Start();
}
catch(Exception exc)
{
string msg = exc.Message + " : " + exc.StackTrace;
Clipboard.SetText(msg);
MessageBox.Show(msg);
}
}
请注意,我必须调用“AddRowToDataDable()”——该方法只是将 Windows 窗体的内容传输到 TestCaseRow 对象。
推荐阅读
- node.js - 如何构建高度安全的端到端加密 React Native 消息传递应用程序
- typescript - 如何验证该文件是否已在 testcafe 中下载?
- node.js - 在 React 应用程序中的多个输入文件上运行 ffmpeg (WASM/NodeJS)
- node.js - 无法将 npm 从 6.14.8 更新到 7.3;删除 npm.cmd、npx.cmd 和 npm 会导致更多错误
- python - 将多索引数据框转换为嵌套字典
- node.js - 节点 express REST API 中的 CORS 错误(PATCH 请求)
- python - 如何将绝对路径转换为函数内的相对路径?
- ios - SwiftUI - 显式动画的快速序列产生奇怪的动画
- android - 从过滤列表视图输入数据时,如何在存储的项目中获取数据?
- reactjs - NextAuth.js 用于与 Google 进行身份验证的 [client_fetch_error] 与 next.js