C#-CS1503-参数1:无法从“字符串”转换为“ int”

时间:2018-12-29 19:20:05

标签: c#

在您回复之前,我已经一遍又一遍地检查了我的代码,并且现在也搜索了大约一个小时以寻找类似的答案。编译器不断抛出错误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");
            }
        }
    }
}

3 个答案:

答案 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();