首页 > 解决方案 > 位置 (-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 是否有类似的问题,但似乎没有相同的情况。

标签: c#sql-serverwinforms

解决方案


我根据梅森的评论重新编码了该方法。这是工作代码:

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 对象。


推荐阅读