在您回复之前,我已经一遍又一遍地检查了我的代码,并且现在也搜索了大约一个小时以寻找类似的答案。编译器不断抛出错误CS1503,我不太确定如何解决此错误。它位于第36和37行,而我注释了有错误的36和37行。这是针对应该搜索牌照并在表中输出其他数据的数据库的。
public partial class Login : Form
{
string connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=J:\Plate Reader\DB\InfoDB.mdf;Integrated Security=True;Connect Timeout=30";
SqlDataReader mdr;
public Login()
{
InitializeComponent();
}
private void btnSearch_Click(object sender, EventArgs e)
{
using (SqlConnection sqlCon = new SqlConnection(connectionString))
{
sqlCon.Open();
string selectQuery = "SELECT * From Plate WHERE Plate='" + txtPlate.Text;
SqlCommand command = new SqlCommand(selectQuery, sqlCon);
mdr = command.ExecuteReader();
if (mdr.Read())
{
labelName.Text = mdr.GetString("Name"); //Right here
labelWanted.Text = mdr.GetInt32("Bounty").ToString(); //and here
}
else
{
MessageBox.Show("No Data For This Plate");
}
}
}
}
答案 0 :(得分:1)
如注释中所述,GetString和GetInt32都需要整数类型的参数。该整数是该字段在“选择字段”列表中的位置。如果您不想使用职位,可以写
labelName.Text = mdr.GetString(mdr.GetOrdinal("Name"));
这一简单的行可以很容易地在扩展方法中进行转换,将扩展方法添加到代码为的静态类中
public static class ReaderExtensions
{
public static string GetString(this SqlDataReader source, string fieldName)
{
return source.GetString(source.GetOrdinal(fieldName));
}
}
这最终使您可以编写
string labelText = mdr.GetString("Name");
当然也可以为接受字段名称的GetInt32编写相同的内容。顺便说一下,如果我没记错的话,MySql版本会直接在程序集中包含这些重载
答案 1 :(得分:0)
GetInt32需要一个'int'参数。
您正在传递字符串。
您需要send in the ordinal position个列。
改为使用此:
mdr.GetInt32(mdr.GetOrdinal("Name"));
您可能要考虑使用像Dapper这样的微型ORM来简化事情。
答案 2 :(得分:-1)
原因是GetString(i)
和GetInt32(i)
方法需要从零开始的列序作为参数。如果要按名称从列中检索数据,则应使用indexer:
labelName.Text = mdr["Name"].ToString();
labelWanted.Text = mdr["Bounty"].ToString();