2

挿入クエリを使用してテーブルに値を挿入する必要があります...データベースに保存されているテーブルには3つの列があります。 datagridview .....挿入するためのボタンのコードは次のとおりです

con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\dbsave.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
if (con.State == ConnectionState.Closed)
{
    con.Open();
}
for (Int32 i = 0; i < dataGridView1.Rows.Count-1; i++)
{
    String query1 = 
        "INSERT INTO " + tbName + 
        " ( Date, SensorValue, Difference) " + "VALUES (" +     
        dataGridView1.Rows[i].Cells[0].Value + "," + 
        dataGridView1.Rows[i].Cells[1].Value + "," + 
        dataGridView1.Rows[i].Cells[2].Value + ")";
    SqlCommand cmd1 = new SqlCommand(query1, con);
    cmd1.ExecuteNonQuery();
}
con.Close();
MessageBox.Show("The table has been saved");

もちろん、エラーはクエリの実行中に発生します....日付列の最初のエントリは値です:12/05/2012 14:32:00 ....基本的に、SQLは配置されたコロンを受け入れません14 ....どうすればこの問題を解決できますか? 助けてください

4

4 に答える 4

5

クエリを更新し、アポストロフィを追加します。

String query1 = 
    "INSERT INTO " + tbName + 
    " ( Date, SensorValue, Difference) " + "VALUES ('" +     
    dataGridView1.Rows[i].Cells[0].Value + "'," + 
    dataGridView1.Rows[i].Cells[1].Value + "," + 
    dataGridView1.Rows[i].Cells[2].Value + ")";
SqlCommand cmd1 = new SqlCommand(query1, con);

しかし、私はLiathに同意します、パラメータはより安全です。

于 2012-11-23T08:46:22.960 に答える
2

そのコードはコンパイルすらしないので、ランタイムエラーを出すことはできません。

ここに引用符が多すぎます:

String query1 = "INSERT INTO " + tbName + " (" Date, Sensor...

する必要があります:

String query1 = "INSERT INTO " + tbName + " ( Date, Sensor...

日時の値がある場合は、その周りにアポストロフィが必要です。

...LUES (" + dataGridView1.Rows[i].Cells[0].Value + "," + ...

する必要があります:

...LUES ('" + dataGridView1.Rows[i].Cells[0].Value + "'," + ...
于 2012-11-23T08:47:29.887 に答える
2

パラメータ化されたクエリを使用してみてください。そのようです:

string query = "INSERT INTO table (Date, SensorValue, Differences) VALUES (@Date, @SensorValue, @Differences)";            
var command = new SqlCommand(query, con);
command.Parameters.Add(new SqlParameter("@Date", System.Data.SqlDbType.DateTime));
command.Parameters.Add(new SqlParameter("@SensorValue", System.Data.SqlDbType.Float));
command.Parameters.Add(new SqlParameter("@Differences", System.Data.SqlDbType.Float));
for (int i = 0; i < dataGridView1.Rows.Count-1; i++)
{
    command.Parameters["@Date"].Value = Convert.ToDateTime(dataGridView1.Rows[i].Cells[0].Value);
    command.Parameters["@SensorValue"].Value = Convert.ToDecimal(dataGridView1.Rows[i].Cells[1].Value);
    command.Parameters["@Differences"].Value = Convert.ToDecimal(dataGridView1.Rows[i].Cells[2].Value);
    command.ExecuteNonQuery();
}
于 2012-11-23T08:55:01.047 に答える
0

パラメータを使用することを強くお勧めしますが、すべての変数を確認しないと診断が困難です。この種の問題を見つけやすくするだけでなく、SQLインジェクション攻撃から保護します。

于 2012-11-23T08:45:48.033 に答える