我尝试使用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());
}
谢谢!
答案 0 :(得分:4)
从数据库中检索数据后,您必须Read
:
while (myReader.Read())
{
Console.Out.WriteLine(myReader[5].ToString());
}
您可以在MSDN上看到一个示例。
其他一些说明:
如果myReader[5]
可能是null
,请考虑使用Convert.ToString(myReader[5])
。这将返回一个空字符串而不是抛出异常。
如果您使用的是.NET 4.5,可以试试alternate syntax:myReader.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
}
}