0

コードの何が問題になっていますか? SQL Server Management Studio と C# の間の接続をセットアップすると、「ExecuteNonQuery: 接続プロパティが初期化されていません」というエラーが表示されます。

private void button1_Click(object sender, EventArgs e)
{
    SqlConnection con = new SqlConnection();
    con.ConnectionString= "Database= hotel; server= Sherissa\SQLEXPRESS";
    con.Open();
    SqlCommand cmd = new SqlCommand("insert into CheckIn (@TransactionId,@GuestName,@RoomType,@RoomNo,@ReservationDate,@CheckInDate,@CheckOutDate,@NoOfDays,@NoOfAdults,@NoOfChildren)");
    cmd.Parameters.AddWithValue("@TransactionId",textBox1.Text);
    cmd.Parameters.AddWithValue("@GuestName", textBox2.Text);
    cmd.Parameters.AddWithValue("@RoomType", textBox3.Text);
    cmd.Parameters.AddWithValue("@RoomNo", textBox4.Text);
    cmd.Parameters.AddWithValue("@ReservationDate", textBox5.Text);
    cmd.Parameters.AddWithValue("@CheckInDate", textBox6.Text);
    cmd.Parameters.AddWithValue("@CheckOutDate", textBox7.Text);
    cmd.Parameters.AddWithValue("@NoOfDays", textBox8.Text);
    cmd.Parameters.AddWithValue("@NoOfAdults", textBox9.Text);
    cmd.Parameters.AddWithValue("@NoOfChildren", textBox10.Text);

    cmd.ExecuteNonQuery();
    con.Close();
    MessageBox.Show("DATA ADDED SUCCESSFULLY!!");
}
4

3 に答える 3

3

ここにいくつかのエラーが表示されます。

最初のエラーはあなたの質問の内容です。この問題を解決するには、コマンドを特定の接続に関連付ける必要があります。同時に複数の異なるデータベースに接続している可能性があることに注意してください。コマンドは、使用する接続を認識する必要があります。

次のエラーは、SQL 構文が間違っていることです。必要なVALUESキーワードがありません。

もう 1 つの問題は、接続を正しく閉じていないことです。例外がスローされた場合、コードはその行に到達しませんcon.Close();。これが頻繁に発生すると、データベースからロックアウトされます。

最後に、ちょっとしたことです。私は .AddWithValue() メソッドのファンではありません。.Net に、使用している sql データ型を推測させようとするからです。間違った推測をすることもあり、そうすると、データベースでのインデックスの使用が中断される可能性があるため、パフォーマンスへの影響が深刻になる可能性があります。

4 つの問題をすべて解決するコードを次に示します。

private void button1_Click(object sender, EventArgs e)
{
    using (var con = new SqlConnection("Database= hotel; server= roger\SQLEXPRESS"))
    using (var cmd = new SqlCommand("insert into CheckIn VALUES (@TransactionId,@GuestName,@RoomType,@RoomNo,@ReservationDate,@CheckInDate,@CheckOutDate,@NoOfDays,@NoOfAdults,@NoOfChildren)", con))
    {

        cmd.Parameters.Add("@TransactionId", SqlDbType.Int).Value = int.Parse(textBox1.Text);
        cmd.Parameters.Add("@GuestName", SqlDbType.NVarChar, 50).Value = textBox2.Text;
        cmd.Parameters.Add("@RoomType", SqlDbType.NVarChar, 10).Value = textBox3.Text;
        cmd.Parameters.Add("@RoomNo", SqlDbType.NChar, 4).Value = textBox4.Text;
        cmd.Parameters.Add("@ReservationDate", SqlDbType.DateTime).Value = datetime.Parse(textBox5.Text);
        cmd.Parameters.Add("@CheckInDate", SqlDbType.DateTime).Value = datetime.Parse(textBox6.Text);
        cmd.Parameters.Add("@CheckOutDate", SqlDbType.DateTime).Value = datetime.Parse(textBox7.Text);
        cmd.Parameters.Add("@NoOfDays", SqlDbType.Int).Value = int.Parse(textBox8.Text);
        cmd.Parameters.Add("@NoOfAdults", SqlDbType.Int).Value = int.Parse(textBox9.Text);
        cmd.Parameters.Add("@NoOfChildren", SqlDbType.Int).Value = int.Parse(textBox10.Text);

        con.Open();
        cmd.ExecuteNonQuery();
    }
    MessageBox.Show("DATA ADDED SUCCESSFULLY!!");
}

もちろん、使用するデータ型を推測する必要がありました。また、自分のコードでは、入力を解析する前に入力の検証にもう少し力を入れていました。

于 2013-05-28T20:36:29.260 に答える
1
SqlCommand cmd = new SqlCommand("insert into CheckIn (@TransactionId, @GuestName, @RoomType, @RoomNo, @ReservationDate, @CheckInDate, @CheckOutDate, @NoOfDays, @NoOfAdults, @NoOfChildren)");`

この行は、次のように入力する必要があります。

SqlCommand cmd = new SqlCommand("insert into CheckIn (@TransactionId, @GuestName, @RoomType, @RoomNo, @ReservationDate, @CheckInDate, @CheckOutDate, @NoOfDays, @NoOfAdults, @NoOfChildren)", con ); 
于 2013-05-28T20:28:58.130 に答える