我对SQL有点新鲜,所以我不确定我是否正确地采用了这种方式。
我试图从我的SQL Server数据库中获取数据,我想知道checkedin
是否为1/0,但它需要搜索特定用户并在最新日期之后排序。
我想做的是这样的事情:
string connectionString = ".....";
SqlConnection cnn = new SqlConnection(connectionString);
SqlCommand checkForInOrOut = new SqlCommand("SELECT CHECKEDIN from timereg ORDER BY TIME DESC LIMIT 1 WHERE UNILOGIN = '" + publiclasses.unilogin + "'", cnn);
所以我的问题是,我这样做了吗?我如何获取收集的数据,如果一切正确处理它应该返回1或0.我应该使用某种SqlDataReader
?我在C#/ WPF
由于
答案 0 :(得分:3)
using (SqlDataReader myReader = checkForInOrOut.ExecuteReader())
{
while (myReader.Read())
{
string value = myReader["COLUMN NAME"].ToString();
}
}
这是您从SQL读取数据的方式,但我建议您查看Parameters.AddWithValue
答案 1 :(得分:2)
您的查询中存在一些错误。在使用Sql Server类时,ORDER BY和LIMIT是MySql关键字之前的第一个WHERE。所以你应该使用 TOP值。
int checkedIn = 0;
string cmdText = @"SELECT TOP 1 CHECKEDIN from timereg
WHERE UNILOGIN = @unilogin
ORDER BY TIME DESC";
string connectionString = ".....";
using(SqlConnection cnn = new SqlConnection(connectionString))
using(SqlCommand checkForInOrOut = new SqlCommand(cmdText, cnn))
{
cnn.Open();
checkForInOrOut.Parameters.Add("@unilogin", SqlDbType.NVarChar).Value = publiclasses.unilogin;
// You return just one row and one column,
// so the best method to use is ExecuteScalar
object result = checkForInOrOut.ExecuteScalar();
// ExecuteScalar returns null if there is no match for your where condition
if(result != null)
{
MessageBox.Show("Login OK");
// Now convert the result variable to the exact datatype
// expected for checkedin, here I suppose you want an integer
checkedIN = Convert.ToInt32(result);
.....
}
else
MessageBox.Show("Login Failed");
}
注意我是如何通过正确使用参数来替换字符串连接以避免解析问题和SQL注入攻击。最后,每个一次性物体(特别是连接)应该进入使用块