读取器不断返回System.Data.SqlDataReader

时间:2018-12-18 16:47:13

标签: c# sql-server database

我正在编写一个用于银行帐户的程序,人们可以在其中注册一个帐户并获得自己的银行帐户。

现在,我的数据读取器不断在我的标签中返回一些奇怪的参数。

public void Saldo()
{
    SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\Jobva\source\repos\Fundamentals\Fundamentals\bin\Debug\BankOfFontys.mdf;Integrated Security=True");
    con.Open();

    SqlCommand myCommand2 = con.CreateCommand();
    myCommand2.CommandText = "SELECT saldo FROM Account WHERE gebruikersnaam ='" + naam + "'";
    myCommand2.CommandType = CommandType.Text;

    SqlDataReader reader2 = myCommand2.ExecuteReader();

    saldoLbl.Text = Convert.ToString(reader2);
}

这是我的代码,但是由于某种原因它没有返回实际值,我是否也在命令中使用了正确的版本,“ naam”是一个字符串,其中包含用户输入的用户名,因此应该仅在该用户名与字符串匹配的列中搜索。

这是如何工作的?

2 个答案:

答案 0 :(得分:1)

在读取一行(并检查是否确实有一行)之后,需要从阅读器中选择值。在下面的代码示例中,我假设您的saldo是一个整数值。

using (SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\Jobva\source\repos\Fundamentals\Fundamentals\bin\Debug\BankOfFontys.mdf;Integrated Security=True")) {
    con.Open();
    SqlDataReader reader2 = myCommand2.ExecuteReader();
    if (reader2.Read()) {
        saldoLbl.Text = reader2.GetInt32(0).ToString();
    }
    reader2.Close();
}

阅读文档可能是一个好主意,因为这是在C#中使用SQL的基础:

https://docs.microsoft.com/de-de/dotnet/framework/data/adonet/retrieving-data-using-a-datareader

您还可以从那里了解ExecuteScalar()哪种情况更适合您的用例。

答案 1 :(得分:0)

您将返回SqlDataReader对象的字符串表示形式。您实际要做的是从数据读取器获取列。有多种方法可以执行此操作,但是您可以尝试执行以下操作:

    SqlDataReader reader2 = myCommand2.ExecuteReader();
    if (reader2.HasRows)
    {
        while (reader2.Read())
        {
            // reader2[] returns objects so cast them to your datatype
            var yourValue = reader2[0].ToString();

            // alternative syntax using column names
            int intValue = Convert.ToInt32(reader2["ID"]);
        }
    }

reader[index]将按选择顺序获得列,而reader["ColumnName"]将按列名获取值。

您应该查看SqlDataReader文档here