[英]SQL Insert statement syntax
基本上我正在做的是,在單擊按鈕時,程序將根據用戶選擇的內容從特定行中提取數據,並使用INSERT
將其放置在不同的表中。 以下是代碼。
private void button3_Click(object sender, EventArgs e)
{
const String connectionString = "Data Source = Vanessa-PC\\SQLEXPRESS; Initial Catalog = IUMDC; Connect Timeout = 15; Integrated Security = true";
SqlConnection con = new SqlConnection(connectionString);
//int SituationID1;
label24.Show();
foreach (SitID x in Sittbl)
{
if (x.ID == Convert.ToInt16(comboBox1.SelectedItem))
{
try
{
con.Open();
SqlCommand command = new SqlCommand("SELECT * FROM Situation WHERE SituationID=" + x.SitIDs, con);
SqlDataReader dr = command.ExecuteReader();
while (dr.Read())
{
sitid1 = Convert.ToInt32(dr[0]);
name1 = dr[4].ToString();
incident1 = Convert.ToDateTime(dr[1]);
charges1 = dr[5].ToString();
nature1 = dr[2].ToString();
}
con.Close();
}
catch (SqlException ex)
{
MessageBox.Show("Database failed to connect" + ex.Message);
}
//SituationID = x.SitIDs;
}
}
try
{
con.Open();
SqlCommand command1 = new SqlCommand("INSERT INTO CurrentSit VALUES (" + sitid1 + ",'" + incident1.ToString("YYYY-mm-DD") + "', '" + nature1 + "', '" + name1 + "', '" + charges1 + "'", con);
SqlDataReader dr1 = command1.ExecuteReader();
con.Close();
}
catch (SqlException ex)
{
MessageBox.Show("Database failed to connect" + ex.Message);
}
//Situation Sit = new Situation();
//Sit.ShowDialog();
}
我的代碼失敗並說
“行項目附近的語法不正確”
兩個表的類型相同,我已經嘗試徹底測試!
看起來您的最后一條 sql 語句不正確。 也許原因是在你的 sql 語句中使用了撇號,但你不應該關心它。 我在回答的中間解釋了為什么你不應該關心。
SqlCommand command1 = new SqlCommand("INSERT INTO CurrentSit VALUES (" + sitid1 + ",'" + incident1.ToString("YYYY-mm-DD") + "', '" + nature1 + "', '" + name1 + "', '" + charges1 + "'", con);
要找出究竟是什么問題,您可以改為指定列名。 但我建議您使用參數化查詢,甚至不需要指定列名。
SqlCommand command1 = new SqlCommand("INSERT INTO CurrentSit VALUES(@sitid1, @incident1, @nature1, @name1, @charges1)", con);
command1.Parameters.AddWithValue("@sitid1", sitid1);
command1.Parameters.AddWithValue("@incident1", incident1.ToString("YYYY-mm-DD"));
command1.Parameters.AddWithValue("@nature1", nature1);
command1.Parameters.AddWithValue("@name1", name1);
command1.Parameters.AddWithValue("@charges1", charges1);
command1.ExecuteNonQuery();
您應該始終使用參數化查詢。 這種代碼對SQL 注入攻擊是開放的。
同樣正如 Marc 所提到的,對這個 sql 語句使用ExecuteReader()
沒有意義,因為它只是INSERT
數據,不返回任何數據。 因此,在這種情況下,您只需要使用ExecuteNonQuery()
。
嘗試在查詢中指定列:
"INSERT INTO CurrentSit (sitid, incident, nature, name1, charges) VALUES (" + sitid1 + ",'" + incident1.ToString("YYYY-mm-DD") + "', '" + nature1 + "', '" + name1 + "', '" + charges1 + "'", con)";
作為附加說明,還要學習使用參數化查詢。 例如:
command1.Parameters.AddWithValue("@name1", name1);
command1.Parameters.AddWithValue("@charges1", charges1);
http://johnhforrest.com/2010/10/parameterized-sql-queries-in-c/
您的直接問題是您的INSERT
語句中有一些無效的語法; 您用來構建它的值之一很可能有一個撇號,它會提前終止您的字符串。
你更大的問題是你永遠不應該以這種方式構建插入語句。 除了很容易出現您所看到的那種錯誤之外,它也是 SQL 注入攻擊的經典開端。 (想象一下,例如,如果情況的性質是foo'); drop table situation; --
foo'); drop table situation; --
foo'); drop table situation; --
)。
您應該使用參數化查詢:
var sql = "INSERT INTO CurrentSit VALUES (@sitid, @incident, @nature, @name, @charges)"
var cmd = new SqlCommand(sql, con);
cmd.Parameters.Add("@Sitid", SqlDbType.Int).Value = sitid1;
// etc.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.