在SQL

时间:2016-11-01 10:18:25

标签: c# sql-server

我对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

中这样做

由于

2 个答案:

答案 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注入攻击。最后,每个一次性物体(特别是连接)应该进入使用块