0

質問

私はしばらくこれに苦労してきました。選択コマンドを初期化したと思っていたのに、以下のエラーが発生しましたか?

dataadapter.selectcommand.connection プロパティを初期化する必要があります

これが問題になる可能性があることを読んだので、主キーが設定されていないためにこのエラーが発生しないことはわかっています。私は間違いなく主キーを持っています。

バックグラウンド

この関数は、if ステートメントを使用して呼び出されるクエリを選択します。クエリ内には、エンド ユーザーが 2 つのコンボボックスで選択した内容に基づいて選択されるパラメーター化された変数があります。

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());

                }
            }




        }
4

3 に答える 3

2

問題は、adapter.SelectCommand = command; を設定した選択コマンドを設定していないことです。// cmd1 はあなたの SELECT コマンドであり、新しい sqlCommand であるコマンドを定義していないと思いました...何をしようとしているのかについての詳細を教えてください。

于 2015-03-29T22:16:15.313 に答える
2

このコードadapter.SelectCommand = command;は、接続を指定せずに SqlCommand のみで初期化する SqlCommand を使用しています。あなたもやり過ぎだと思います。達成したいことを言及すると、より良い答えを得るのに役立つ場合があります。

于 2015-03-29T22:17:34.663 に答える
1

サンプル コードをかなり単純化する必要があります。getDataTable()がどこで呼び出されているかさえわかりません。

いずれにせよ、あなたは失敗でよく知られている道を進んでいます。およびオブジェクトをグローバル変数としてインスタンス化しないSqlConnectionでください。代わりに、呼び出し元のコード ブロック内で作成および破棄する必要があります。 SqlCommand

なんで?IDisposable を実装し、管理されていないリソースを処理するためです。これは、プログラムに問題がある場合にメモリとデータベース接続がリークすることを意味します。

1 秒間に何千もの SqlConnection または SqlCommand オブジェクトを作成および破棄しても、パフォーマンスの問題は発生しないことに注意してください。

最終的に、物事を複雑にしすぎているようです。

于 2015-03-29T22:20:26.450 に答える