我有一个包含4列HouseNo
,Date
,Time
和IndoorTemp
的数据库。在我的C#Windows应用程序中,我有4个文本框,每个文本框用于上面的列。
用户在文本框中输入HouseNo,Date和Time值。这里的输入应该是我的SQL Where子句的一部分,其输出为室内温度。然后应该在最后一个文本框中显示。
我使用过这个连接:
// Create a String to hold the database connection string.
string sdwConnectionString = @"Data Source=IE1ADTBD5ZL1S\;Initial Catalog=ThermostatData2;Integrated Security=True";
// Create a connection
SqlConnection sdwDBConnection = new SqlConnection(sdwConnectionString);
我尝试了一个代码来执行此操作,但它失败了。 我的代码是,
cmd.IndoorTemp = "select * from ThermData where HouseNo = '" + HouseNovalue.Text + "' and Date = '" + Datevalue.Text + "' and Time = '" + Timevalue.Text + "' ";
我如何达到预期的效果。
我是C#的新手并且不太了解。以上所有代码也都是在一些博客的帮助下完成的。
请帮我解决这个问题。还建议一本好书,我可以学习用SQL Server编写C#。非常感谢。
答案 0 :(得分:2)
试试这个:
using (SqlConnection c = new SqlConnection("your connection string"))
{
c.Open();
using (SqlCommand cmd = new SqlCommand("SELECT IndoorTemp FROM ThermData WHERE HouseNo = @HouseNo AND Date = @Date AND Time = @Time")
{
cmd.Parameters.AddWithValue("@HouseNo", HouseNovalue.Text);
cmd.Parameters.AddWithValue("@Date", Datevalue.Text);
cmd.Parameters.AddWithValue("@Time", Timevalue.Text);
var indoorTemp = cmd.ExecuteScalar();
Indoortemp.Text = indoorTemp;
}
}
在此示例中,您正在构建一个新的SqlConnection
,但您正在利用using
语句来确保它已正确处理。你正在为SqlCommand
做同样的事情。然后,您正在利用参数化语句来确保您不受SQL注入的影响。
并且不要回避这种方法,即使它只是一个没有其他人使用的个人项目,因为你练习你的游戏方式。如果您在练习时不使用参数化SQL,那么在游戏时肯定不会。
最后,你正在利用ExecuteScalar
返回结果集第一行的第一列 - 这就是你想要的。
答案 1 :(得分:0)
首先使用参数化查询:
var cmd = new SqlCommand("select * from ThermData where HouseNo = @houseno and Date = @date and Time = @time", sdwDBConnection);
cmd.Parameters.AddWithValue("@houseno", HouseNovalue.Text);
cmd.Parameters.AddWithValue("@date", Datevalue.Text);
cmd.Parameters.AddWithValue("@time", Timevalue.Text);
获得你可以做的结果:
sdwDBConnection.Open();
var reader = cmd.ExecuteReader();
if (reader.Read()) //if there is at least one result
{
//data from reader
IndoorTemp.Text = reader["IndoorTemp"]; //access value returned for column IndoorTemp
}