我遇到了以下问题。我不知道我做错了什么。它向我显示一个错误“'System.Data.Common.DbDataReader.GetString(int)'的最佳重载方法匹配'有一些无效的参数。”
SqlDataReader myReader;
mycon.Open();
myReader = cmdDatabase.ExecuteReader();
while (myReader.Read())
{
string cName = myReader.GetString("C_Name");
textBox2.Text=cName;
}
答案 0 :(得分:3)
GetString
方法仅接受int
。你传给它string
。
从MSDN开始,参数(整数)表示“从零开始的列序数。”
如果C_Name
是第一列(例如),则您需要致电:
string cName = myReader.GetString(0);
答案 1 :(得分:2)
正如现在多次提到的,GetString
的签名需要一个表示列索引的整数。您可以使用GetOrdinal
将列名称转换为其序号位置。
因此,您可以使用"C_NAME"
获取myReader.GetString(myReader.GetOrdinal("C_NAME"))
列的字符串值。
SqlDataReader
也overrides the indexer,您可以将其写为(string)myReader["C_Name"]
完整示例:
var sqc = new SqlCommand("SELECT C_NAME from table", con);
using (var reader = sqc.ExecuteReader())
{
while (reader.Read())
{
int ordinal = reader.GetOrdinal("C_NAME");
string byOrdinal = reader.GetString(ordinal);
string byIndexer = (string)reader["C_NAME"];
Console.Writeline("Column {0}, has the value of {1} (which is the same as {2})",
ordinal, byOrdinal, byIndexer);
}
}
您还应该小心将您的读者包装在using
语句中,以确保您不会泄漏数据库连接或遇到您考虑启用MARS的情况。
答案 2 :(得分:1)
查看GetString()
的签名:
System.Data.Common.DbDataReader.GetString(int)
它需要一个整数序数(即从零开始的位置)并且您尝试传递一个字符串。没有重载采用单个字符串参数。
答案 3 :(得分:1)
如错误所示,您正在尝试使用不存在的GetString
重载。
您正在传递string
参数,而该方法期望integer
表示所请求列的索引。
您可以在dcumetnation
中详细了解该方法尝试将代码更改为:
int indexOf cNameIdx = 5;// replace this with the real index from your select query
string cName = myReader.GetString(cNameIdx );