选择命令初始化错误

时间:2015-03-29 22:02:00

标签: c# sql-server sqlcommandbuilder

问题

我一直在努力解决这个问题。我有下面的错误,虽然我以为我已经初始化了select命令?

  

需要初始化dataadapter.selectcommand.connection属性

我知道由于没有设置主键,我没有收到此错误,因为我已经读过这可能是问题所在。我肯定有一把钥匙。

背景

此函数使用if语句选择调用的查询。在查询中,有基于最终用户在两个组合框中选择的内容而选择的参数化变量。

SQLSelection();

示例查询

   SQL = "SELECT * FROM dbo.joblist_TEST WHERE username = @username and status in ('New','Hold')";

无效的位是Update_Click事件句柄。

代码

 public partial class Form1 : Form
    {
        int weeks = 0;
        SqlCommand command = new SqlCommand();
        SqlDataAdapter adb = new SqlDataAdapter();
        SqlDataAdapter adapter = new SqlDataAdapter();
        SqlCommandBuilder builder = new SqlCommandBuilder();
        SqlCommand selectCommand = new SqlCommand();
        DataSet ds = new DataSet();
        DataTable dt = new DataTable();
        SqlConnection con = new SqlConnection();

        String ConnString = "Data Source=sqlexpress; Initial Catalog=MobileData; User ID=mobile; Password=pw";
}


public DataTable getDataTable()
            {

            //Decide what query
            String SQL = SQLSelection();

            // SqlDbConnection con = new OleDbConnection(ConnString);
            SqlConnection con = new SqlConnection(ConnString);

            //open connection to database
            con.Open();

            //create adapter that sits inbetween dataset and datbase
            SqlDataAdapter adapter = new SqlDataAdapter();


            adapter.SelectCommand = new SqlCommand(SQL, con);
            adapter.UpdateCommand = new SqlCommand(SQL, con);

            adapter.SelectCommand.Parameters.Add("@username", SqlDbType.VarChar).Value = auditorCmb.Text;
            adapter.SelectCommand.Parameters.Add("@status", SqlDbType.VarChar).Value = statusCmb.Text;

            SqlCommandBuilder builder = new SqlCommandBuilder(adapter);


            adapter.Fill(ds, "jobList_Test");
            dt = ds.Tables["jobList_Test"];


            dataGridView1.DataSource = ds.Tables["jobList_Test"];

            int rowCount = rowCount = dt.Rows.Count;
            label10.Text = rowCount.ToString("n0");


            return dt;
        }

        public void Update_Click(object sender, EventArgs e)
        {

            if (MessageBox.Show("Are you sure you want to save changes?", "Save Changes", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {

                try
                {


                    adapter.SelectCommand = command; // cmd1 is your SELECT command

                    SqlCommandBuilder builder = new SqlCommandBuilder(adapter);

                    builder.GetUpdateCommand(); // Force the building of commands
                    adapter.Update(ds, "jobList_Test");
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message.ToString());

                }
            }




        }

3 个答案:

答案 0 :(得分:2)

问题在于您没有设置刚刚设置的select命令 adapter.SelectCommand = command; // cmd1是你的SELECT命令,我认为你没有定义什么命令只是新的sqlCommand ...请更多关于你想做什么的信息,因此我可以帮助更多。

答案 1 :(得分:2)

您的此代码adapter.SelectCommand = command;正在使用仅在未指定连接的情况下使用SqlCommand初始化的SqlCommand。我认为你也是在做事。提及你想要达到的目标可能有助于获得更好的答案。

答案 2 :(得分:1)

您需要相当简化示例代码。我没有看到getDataTable()被调用的地方。

无论哪种方式,你都会走上一条众所周知的失败之路。 SqlConnectionSqlCommand对象应永远实例化为全局变量。相反,它们应该在调用代码块中创建和处理。

为什么呢?因为它们实现了IDisposable并处理非托管资源。这意味着如果/当程序出现问题时,您将泄漏内存和数据库连接。

请注意,每秒创建和处理数千个SqlConnection或SqlCommand对象不会导致性能问题。

最终,看起来你认真对待事情变得复杂。