问题 我可以'保存更新我的数据库;需要更新命令

神是

成员
已加入
2019年7月31日
留言内容
11
编程经验
Beginner
保存records.png时出错


我有决心开发薪资数据库。
在Microsoft Visual Studio 2015中创建表单后,我将DataGridView和Details的两个节点都拖到了DataSet窗口的前面。
当我运行该应用程序时,我能够将我输入的两个条目保存到数据库中。但是此后,我无法再保存任何记录。
附件是单击“保存”按钮时显示的错误消息。
我恳切希望有人能帮助我解决我的问题。

- 神是
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,604
地点
弗吉尼亚州切萨皮克
编程经验
10+
该错误似乎很容易解释:更新调用需要有效的更新命令才能保存修改后的行。

请发布您的代码。我们也许能够发现您当前的update命令可能出了什么问题。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,563
地点
悉尼,澳大利亚
编程经验
10+
It appears that you are using a typed DataSet. In that case, the wizard will generate the UpdateCommand automatically 如果 it is able to do so. If it wasn't able to do so in your case then that is most likely because one or more of your tables doesn't have a primary key. With no primary key, there's no obvious way to uniquely identify a record to update or delete, thus no UpdateCommand or DeleteCommand can be generated. It's a very rare thing that not having a primary key in a database table is a good idea. You should fix that and then regenerate the typed DataSet in the Data Sources window to have those commands automatically generated.
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,563
地点
悉尼,澳大利亚
编程经验
10+
为了将来参考,请不要张贴代码图片。代码是文本,因此将其发布为文本,并设置为易于阅读的代码格式。该站点上的代码编辑器使您可以突出显示特定的行,从而可以指示发生错误的位置等。错误消息也是文本。

另外,当您发布屏幕截图时(有时可能会有所帮助),请仅在其中一小部分有用时不要发布整个屏幕。通过以最容易使用的形式发布所有相关内容,而不是无关紧要的内容,帮助我们为您提供帮助。关于屏幕截图,我们无法从中复制和粘贴文本,因此这意味着我们无法轻松运行代码或搜索错误消息等。如果您需要花费更多的时间和精力来减少我们的时间和精力,那就是应该发生的事情,因为我们是陌生人,我们自愿花时间帮助您。我并不是说这不是您这次要尝试的操作,但是您会更好地了解下一次的操作方式。
 

神是

成员
已加入
2019年7月31日
留言内容
11
编程经验
Beginner
以下是我正在构建的项目的代码。
在代码中可以看到,我有两个带有不同代码的单独的保存按钮,但是它们都无法保存更新。

我正在等待协助:-

使用系统;
使用System.Collections.Generic;
使用System.ComponentModel;
使用System.Configuration;
使用System.Data;
使用System.Data.SqlClient;
使用System.Drawing;
使用System.Linq;
使用System.Text;
使用System.Threading.Tasks;
使用System.Windows.Forms;
命名空间薪资
{
公共局部类Form1:表单
{
公共Form1()
{
InitializeComponent();
}
SqlConnection con =新的SqlConnection(ConfigurationManager.ConnectionStrings ["con"].ConnectionString);
SqlCommand命令=新的SqlCommand();


私有void Form1_Load(对象发送者,EventArgs e)
{
// TODO:这行代码将数据加载到“ salariesDataSet.Salaries”表中。您可以根据需要移动或删除它。
this.salariesTableAdapter.FillBy(this.salariesDataSet.Salaries);
}
//声明变量
十进制BasicSalary,加班,ExtraOvertime,LeaveOutstanding,GrossSalary,SSNIT13,SSNIT5,应纳税收入,IncomeTax,缺勤,TotalDeductions,NetSalary;
int DaysWorked,DaysAbsent;
DateTime EmpDate,CurrentDate;




私人无效saveButton_Click(对象发送者,EventArgs e)
{
this.Validate();
this.salariesBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.salariesDataSet);
}
}

私人void salariesBindingNavigatorSaveItem_Click(对象发送者,EventArgs e)
{
尝试
{
this.Validate();
this.salariesBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.salariesDataSet);
SalariesDataSet.SalariesDataTable deleteSalaries =(SalariesDataSet.SalariesDataTable)
SalariesDataSet.SalariesRow.GetChanges(DataRowState.Deleted);
SalariesDataSet.SalariesDataTable newSalaries =(SalariesDataSet.SalariesDataTable)
SalariesDataSet.SalariesRow.GetChanges(DataRowState.Added);
SalariesDataSet.SalariesDataTablemodifiedSalaries =(SalariesDataSet.SalariesDataTable)
SalariesDataSet.SalariesRow.GetChanges(DataRowState.Modified);

{
//从薪金表中删除所有已删除的薪水。
如果(deletedSalaries!= null)
{
salariesTableAdapter.Update(deletedSalaries);
}
//将新的薪水添加到Salaries表中。
如果(newSalaries!= null)
{
salariesTableAdapter.Update(newSalaries);
}
//更新所有修改后的薪水。
如果(modifiedSalaries!= null)
{
salariesTableAdapter.Update(newSalaries);
}
salariesDataSet.AcceptChanges();
}

}

捕获(System.Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}

}
}
}
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,563
地点
悉尼,澳大利亚
编程经验
10+
请再试一遍。我之前曾要求您将代码发布为文本,然后将其格式化为代码。您已经完成了前者,但没有完成。我试图为您进行格式化,但是您发布的内容完全是一团糟。缩进无处不在,并且代码甚至都不能按原样编译。如果您发布的内容是您自己在VS中看到的内容,那也就不足为奇了。确保已正确格式化了代码,以提高可读性。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,979
地点
英国
编程经验
10+
我已经为您修复了缩进并将您的方法包含在类中,但是我没有多余的时间来阅读您的文章。其他人将需要您的帮助。
使用VS提供的缩进:
使用系统;
使用System.Configuration;
using System.Data;
使用System.Data.SqlClient;
使用System.Windows.Forms;

namespace Payroll
{
    公共局部类Form1:表单
    {
        public Form1()
        {
            InitializeComponent();
        }

        private SqlConnection con =新的SqlConnection(ConfigurationManager.ConnectionStrings ["con"].ConnectionString);
        private SqlCommand命令=新的SqlCommand();

        私有void Form1_Load(对象发送者,EventArgs e)
        {
            // TODO:这行代码将数据加载到“ salariesDataSet.Salaries”表中。您可以根据需要移动或删除它。
            this.salariesTableAdapter.FillBy(this.salariesDataSet.Salaries);
        }

        //声明变量
        private 十进制BasicSalary,加班,ExtraOvertime,LeaveOutstanding,GrossSalary,SSNIT13,SSNIT5,应纳税收入,IncomeTax,缺勤,TotalDeductions,NetSalary;

        private int DaysWorked,DaysAbsent;
        private DateTime EmpDate,CurrentDate;

        私人无效saveButton_Click(对象发送者,EventArgs e)
        {
            this.Validate();
            this.salariesBindingSource.EndEdit();
            this.tableAdapterManager.UpdateAll(this.salariesDataSet);
        }

        私人void salariesBindingNavigatorSaveItem_Click(对象发送者,EventArgs e)
        {
            try
            {
                this.Validate();
                this.salariesBindingSource.EndEdit();
                this.tableAdapterManager.UpdateAll(this.salariesDataSet);
                SalariesDataSet.SalariesDataTable deleteSalaries =(SalariesDataSet.SalariesDataTable)
                SalariesDataSet.SalariesRow.GetChanges(DataRowState.Deleted);
                SalariesDataSet.SalariesDataTable newSalaries =(SalariesDataSet.SalariesDataTable)
                SalariesDataSet.SalariesRow.GetChanges(DataRowState.Added);
                SalariesDataSet.SalariesDataTablemodifiedSalaries =(SalariesDataSet.SalariesDataTable)
                SalariesDataSet.SalariesRow.GetChanges(DataRowState.Modified);

                {
                    //从薪金表中删除所有已删除的薪水。
                    如果(deletedSalaries!= null)
                    {
                        salariesTableAdapter.Update(deletedSalaries);
                    }
                    //将新的薪水添加到Salaries表中。
                    如果(newSalaries!= null)
                    {
                        salariesTableAdapter.Update(newSalaries);
                    }
                    //更新所有修改后的薪水。
                    如果(modifiedSalaries!= null)
                    {
                        salariesTableAdapter.Update(newSalaries);
                    }
                    salariesDataSet.AcceptChanges();
                }
            }
            捕获(System.Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message);
            }
        }
    }
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,563
地点
悉尼,澳大利亚
编程经验
10+
我什至不真正理解您为什么要发布该代码。我告诉您,问题几乎可以肯定是您的数据库表没有主键,但是您根本没有解决这个问题。您的数据库表是否具有主键?如果没有,按照我说的做,添加它们,然后重新生成您的DataSet。没有什么比让您在将来提供帮助时忽略您的建议更好的了。
 

神是

成员
已加入
2019年7月31日
留言内容
11
编程经验
Beginner
谢谢 金西尼,

回到SQL Management Studio时,我发现它没有设置主键,这是正确的。我设置了它,回到了VS,删除了DataSet并重新配置了它,重建了应用程序,现在我可以保存更新了。

非常感谢所有贡献者。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,563
地点
悉尼,澳大利亚
编程经验
10+
回到VS,删除了DataSet并重新配置了它
无需删除现有的数据集并创建一个新的数据集。我首先将您指向“数据源”窗口,因为工具栏中有一个按钮可以在现有DataSet上重新运行向导以更新架构。
 
最佳 底部