SQL选择查询不选择

时间:2014-05-14 03:57:28

标签: c# sql syntax type-conversion

我尝试使用C#using System.Data.SqlClient;从SQL表中查询数据。我能SELECT * FROM table没有问题。我怀疑我的问题可能是由于数据类型,也许是无意中错误地抛出了一些变量。我得到的错误是:没有数据时读取数据的尝试无效。

进一步详情:

在我的SQL表中,Column1和Column3的类型为int。 Column2和Column4的类型为char(1)。 Column5的类型为decimal(5,4)。

您可以在以下代码中帮助确定问题吗?

public void Score(List<Tuple<int, char>> myList)
    {
        int myColumn1 = myList[0].Item1;
        char myColumn2 = myList[0].Item2;
        int myColumn3 = myList[1].Item1;
        char myColumn4 = myList[1].Item2;

        myConnection.Open();

        SqlCommand myCommand = new SqlCommand("SELECT * FROM table" +
        " WHERE Column1 = " + myColumn1 + 
        " AND Column2 = '" + myColumn2 +
        "' AND Column3 = " + myColumn3 +
        " AND Column4 = '" + myColumn4 + "'", myConnection);

        SqlDataReader myReader = null;
        myReader = myCommand.ExecuteReader();

        Console.Out.WriteLine(myReader[5].ToString());         
    }

谢谢!

2 个答案:

答案 0 :(得分:4)

从数据库中检索数据后,您必须Read

while (myReader.Read())
{
    Console.Out.WriteLine(myReader[5].ToString());
}

您可以在MSDN上看到一个示例。

其他一些说明:

  • 如果myReader[5]可能是null,请考虑使用Convert.ToString(myReader[5])。这将返回一个空字符串而不是抛出异常。

  • 如果您使用的是.NET 4.5,可以试试alternate syntaxmyReader.GetFieldValue<string>(5)

答案 1 :(得分:3)

使用参数化查询来避免sql注入

myCommand = new SqlCommand("SELECT * FROM table
        WHERE Column1=@column1
         AND Column2 =@myColumn2 
         AND Column3 = @myColumn3 
         AND Column4 =@myColumn4", myConnection);

  myCommand.Parameters.AddWithValue("@column1", value1);
  myCommand.Parameters.AddWithValue("@myColumn2", value2);
  myCommand.Parameters.AddWithValue("@myColumn3", value3);
  myCommand.Parameters.AddWithValue("@myColumn3", value4);

  using(SqlDataReader reader = myCommand.ExecuteReader())
  {
    while(reader.Read())
    {
      //code here
    }
  }