首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SqlDataAdapter.Update或SqlCommandBuilder不工作

SqlDataAdapter.Update或SqlCommandBuilder不工作
EN

Stack Overflow用户
提问于 2012-04-14 09:15:45
回答 2查看 7.4K关注 0票数 1

我有一个带有datagrid的表单,其中填充了来自sqlserver数据库的数据。数据网格可以很好地填充,但我在将用户所做的更改发送回sql数据库中的表时遇到了问题。我的表单代码如下:

代码语言:javascript
复制
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上,它没有基于给定的SELECT命令构建插入/更新/删除命令。

有没有人看到我做错了什么?

我遗漏了什么?

EN

回答 2

Stack Overflow用户

发布于 2012-04-14 10:23:14

您需要在更新时设置UpdateCommand而不是SelectCommand

代码语言:javascript
复制
 SqlDataAdapter adapter = new SqlDataAdapter();
 SqlCommandBuilder sqlBld = new SqlCommandBuilder(adapter)
 adapter.UpdateCommand = sqlBld.GetUpdateCommand() ;
票数 3
EN

Stack Overflow用户

发布于 2018-03-20 03:33:31

Anurag Ranjhan这个问题很旧,但@Ranjhan提供的答案需要更正。

你不需要写这行:

代码语言:javascript
复制
   adapter.UpdateCommand = sqlBld.GetUpdateCommand() ;

足以写下:

代码语言:javascript
复制
   SqlDataAdapter adapter = new SqlDataAdapter();
   SqlCommandBuilder sqlBld = new SqlCommandBuilder(adapter)
   //remove the next line
   //adapter.UpdateCommand = sqlBld.GetUpdateCommand() ;

Sql update/insert/delete命令基于此行自动生成

代码语言:javascript
复制
 SqlCommandBuilder sqlBld = new SqlCommandBuilder(adapter)

您可以通过执行以下行来查找生成的更新sql:

代码语言:javascript
复制
 sqlBld.GetUpdateCommand().CommandText;

请参阅示例How To Update a SQL Server Database by Using the SqlDataAdapter Object in Visual C# .NET

OP所说的问题可以通过在SQl Server Profiler中查看客户端发送的Sql语句来检查。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10150189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档