[英]SQL insert command only working once in a loop
這是for循環,它將轉到時間並將時間列設置為true。 這是第一次使用,但是當時間增加0.5時,它仍然是錯誤的。 for循環正在嘗試MessageBox.Show(“”+ Time1 +“”); 在for循環中。
for (double Time = time_began_5; Time < time_finished_5; Time = Time + 0.5)
{
string Time1 = Time.ToString("0.00");
try
{
SqlConnection cn = new SqlConnection("Data Source=.\\SqlExpress;Initial Catalog=AllensCroft;Integrated Security=True;MultipleActiveResultSets=True;Application Name=EntityFramework;");
cn.Open();
SqlCommand Command = new SqlCommand("INSERT INTO Slots ([Date],[RoomID],[" + Time1 + "]) Values (@date,@room,1)", cn);
Command.Parameters.AddWithValue("date", date);
Command.Parameters.AddWithValue("room", rooms_combo.SelectedValue);
Command.ExecuteNonQuery();
try
{
cn.Close();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
這是數據庫的樣子,第一個真正的字段工作,但是當它循環到另一個時間時,它仍然是假的,我認為這可能是因為如果我有一個具有該日期的現有行(日期是主鍵) ),我無法更新該行,所以我可能需要一個IF存在行,更新,否則創建一個新行。
你正在插入。 在每個循環中,您插入一個新行,並僅為名稱等於變量Time1
的當前值的列設置值true。
沒有其他列的值,他們可能默認為false。 (我想比特列)
如果您希望每列的默認值為true,那么最好更改數據庫架構,為每個時間列添加默認值,否則您需要一長串參數
編輯:如果您的邏輯規定每個日期只需要一行,並且如果輸入上述情況,則每次將列設置為true,則可以使用存儲過程在數據庫中移動此邏輯:
CREATE PROCEDURE InsertOrUpdateSlotFromCode(@dt smalldatetime, @roomID int)
AS
BEGIN
DECLARE @cnt INT
SELECT @cnt = COUNT(*) from Slots WHERE [Date] = @dt
if @cnt = 0
INSERT INTO Slots ([Date],[RoomID], <here all the time fields> VALUES (@dt, @roomID, 1, ....)
else
UPDATE Slots SET [09.00] = 1, ..... WHERE [Date] = @dt
End
END
然后你的代碼調用sp
using(SqlConnection cn = new SqlConnection(.........))
{
cn.Open();
SqlCommand Command = new SqlCommand("InsertOrUpdateSlotFromCode", cn);
Command.CommandType = CommandType.StoredProcedure;
Command.Parameters.AddWithValue("date", date);
Command.Parameters.AddWithValue("room", rooms_combo.SelectedValue);
Command.ExecuteNonQuery();
}
當然現在你可以完全擺脫循環
試試這個,你不必在每個循環中打開連接,首先創建你的sql語句循環遍歷每個值,然后使用一個語句插入
private string CreateInsertStatement(double time_began_5, double time_finished_5)
{
string sql = "INSERT INTO Slots ([Date],[RoomID],";
string valuesql = " Values (@date,@room,";
for (double Time = time_began_5; Time < time_finished_5; Time = Time + 0.5)
{
string Time1 = Time.ToString("0.00");
sql+ = "[" + Time1 + "],";
valuesql+ = "1,";
}
sql = sql.TrimEnd(',') + ") ";
valuesql = valuesql.TrimEnd(',') + ") ";
return sql + valuesql;
}
private string CreateUpdateStatement(double time_began_5, double time_finished_5)
{
string sql = "UPDATE Slots SET ";
string wheresql = " WHERE [Date] = @date AND [RoomID] = @room";
for (double Time = time_began_5; Time < time_finished_5; Time = Time + 0.5)
{
string Time1 = Time.ToString("0.00");
sql+ = "[" + Time1 + "] = 1,";
}
sql = sql.TrimEnd(',');
return sql + wheresql;
}
然后在你的實際插入代碼:
try
{
SqlConnection cn = new SqlConnection("Data Source=.\\SqlExpress;Initial Catalog=AllensCroft;Integrated Security=True;MultipleActiveResultSets=True;Application Name=EntityFramework;");
cn.Open();
SqlCommand Command;
//check if row exists
Command = new SqlCommand("select count(*) from Slots WHERE [Date] = @date AND [RoomID] = @room", cn);
Command.Parameters.AddWithValue("date", date);
Command.Parameters.AddWithValue("room", rooms_combo.SelectedValue);
var cnt = Command.ExecuteScalar();
if(cnt!=null)
{
string sqlstr = ""
if(Int32.Parse(cnt.ToString()) > 0)
{
sqlstr = CreateUpdateStatement(time_began_5,time_finished_5);
}
else if(Int32.Parse(cnt.ToString()) == 0)
{
sqlstr = CreateInsertStatement(time_began_5,time_finished_5);
}
Command = new SqlCommand(sqlstr, cn);
Command.Parameters.AddWithValue("date", date);
Command.Parameters.AddWithValue("room", rooms_combo.SelectedValue);
Command.ExecuteNonQuery();
}
try
{
cn.Close();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.