Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SqlDataAdapter.Update或SqlCommandBuilder不工作_C#_Sql Server_Winforms_Datagrid_Sqldataadapter - Fatal编程技术网

C# SqlDataAdapter.Update或SqlCommandBuilder不工作

C# SqlDataAdapter.Update或SqlCommandBuilder不工作,c#,sql-server,winforms,datagrid,sqldataadapter,C#,Sql Server,Winforms,Datagrid,Sqldataadapter,我有一个带有datagrid的表单,它由sqlserver数据库中的数据填充。datagrid填充得很好,但是我很难将用户所做的更改发回sql数据库中的表。我的表格编号如下: public partial class frmTimesheet : Form { private DataTable tableTS = new DataTable(); private SqlDataAdapter adapter = new SqlDataAdapter(); private

我有一个带有datagrid的表单,它由sqlserver数据库中的数据填充。datagrid填充得很好,但是我很难将用户所做的更改发回sql数据库中的表。我的表格编号如下:

public partial class frmTimesheet : Form
{
    private DataTable tableTS = new DataTable();
    private SqlDataAdapter adapter = new SqlDataAdapter();
    private int currentTSID = 0;

    public frmTimesheet()
    {
        InitializeComponent();
    }

    private void frmTimesheet_Load(object sender, EventArgs e)
    {
        string strUser = cUser.currentUser;            
        cMyDate cD = new cMyDate(DateTime.Now.ToString());
        DateTime date = cD.GetDate();
        txtDate.Text = date.ToString();
        cboTSUser.DataSource = cUser.GetListOfUsers("active");
        cboTSUser.DisplayMember = "UserID";
        cboTSUser.Text = strUser;
        CheckForTimeSheet();
        PopulateTimeSheet();
    }

    private void CheckForTimeSheet()
    {
        string strUser = cboTSUser.Text;
        cMyDate cD = new cMyDate(txtDate.Text);
        DateTime date = cD.GetDate();
        int newTSID = cTimesheet.TimeSheetExists(strUser, date);
        if (newTSID != this.currentTSID)
        {
            tableTS.Clear();
            if (newTSID == 0)
            {
                MessageBox.Show("Create TimeSheet");
            }
            else
            {
                this.currentTSID = newTSID;
            }
        }
    }

    private void PopulateTimeSheet()
    {
        try
        {
            string sqlText = "SELECT EntryID, CaseNo, ChargeCode, StartTime, FinishTime, Units " +
                             "FROM tblTimesheetEntries " +
                             "WHERE TSID = " + this.currentTSID + ";";
            SqlConnection linkToDB = new SqlConnection(cConnectionString.BuildConnectionString());
            SqlCommand sqlCom = new SqlCommand(sqlText, linkToDB);
            SqlDataAdapter adapter = new SqlDataAdapter(sqlCom);
            adapter.SelectCommand = sqlCom;
            SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
            adapter.Fill(tableTS);
            dataTimesheet.DataSource = tableTS;                
        }
        catch (Exception eX)
        {
            string eM = "Error Populating Timesheet";
            cError err = new cError(eX, eM);
            MessageBox.Show(eM + Environment.NewLine + eX.Message);
        }         
    }

    private void txtDate_Leave(object sender, EventArgs e)
    {
        CheckForTimeSheet();
        PopulateTimeSheet();            
    }

    private void cboTSUser_DropDownClosed(object sender, EventArgs e)
    {
        CheckForTimeSheet(); 
        PopulateTimeSheet();
    }

    private void dataTimesheet_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        try
        {   
            adapter.Update(tableTS);
        }
        catch (Exception eX)
        {
            string eM = "Error on frmTimesheet, dataTimesheet_CellValueChanged";
            cError err = new cError(eX, eM);
            MessageBox.Show(eM + Environment.NewLine + eX.Message);
        }
    }
}
没有异常发生,当我逐步解决这个问题时,似乎是SqlCommandBuilder没有基于gien SELECT命令生成INSERT/UPDATE/DELETE命令

有人能看出我做错了什么吗

我缺少什么?

您需要在更新时设置而不是
选择命令

 SqlDataAdapter adapter = new SqlDataAdapter();
 SqlCommandBuilder sqlBld = new SqlCommandBuilder(adapter)
 adapter.UpdateCommand = sqlBld.GetUpdateCommand() ;

这个问题很老,但提供的答案by@AnuragRanjhan需要纠正。

您不需要写这行:

   adapter.UpdateCommand = sqlBld.GetUpdateCommand() ;
足够写下:

   SqlDataAdapter adapter = new SqlDataAdapter();
   SqlCommandBuilder sqlBld = new SqlCommandBuilder(adapter)
   //remove the next line
   //adapter.UpdateCommand = sqlBld.GetUpdateCommand() ;
Sql更新/插入/删除命令是基于此行自动生成的

 SqlCommandBuilder sqlBld = new SqlCommandBuilder(adapter)
您可以通过执行以下行找到生成的更新sql:

 sqlBld.GetUpdateCommand().CommandText;
参见示例


OP所说的问题可以通过查看客户端在
Sql Server Profiler

中发送的Sql语句来检查。请查看我的答案好吗?您可以删除第三行
adapter.UpdateCommand=sqlBld.GetUpdateCommand()好心的,你能回顾一下我的答案吗。