如何使用C#从SQL数据库中获取值并放入文本框?

3

我正在创建一个预订管理系统,但在试图从SQL数据库获取数据并插入到应用程序的一组文本框中时遇到了问题。

当单击按钮时,我想在DataGridView中显示客户详细信息,但是单击按钮后,应用程序会抛出以下错误消息:

无效的尝试读取不存在的数据。

我已经附上了一个屏幕截图,展示了我想要查看客户详细信息的界面,以及按钮的代码,该按钮最终将在各自的文本框中显示客户详细信息。任何帮助都将不胜感激!

    SqlConnection sc = new SqlConnection("Data Source=localhost;Initial Catalog=LoginScreen;Integrated Security=True");
        SqlCommand com = new SqlCommand();
        com.Connection = sc;
        sc.Open();
        SqlDataReader read = (null);
        com.CommandText = ("select * from Pending_Tasks");
        read = com.ExecuteReader();
        CustID.Text = (read["Customer_ID"].ToString());
        CustName.Text = (read["Customer_Name"].ToString());
        Add1.Text = (read["Address_1"].ToString());
        Add2.Text = (read["Address_2"].ToString());
        PostBox.Text = (read["Postcode"].ToString());
        PassBox.Text = (read["Password"].ToString());
        DatBox.Text = (read["Data_Important"].ToString());
        LanNumb.Text = (read["Landline"].ToString());
        MobNumber.Text = (read["Mobile"].ToString());
        FaultRep.Text = (read["Fault_Report"].ToString());
        sc.Close();

1
你没有在读取任何东西!你只是执行了它,但是你没有遍历阅读器!使用 while(read.Read()) - 请注意,如果有多个结果集,则只会保存最后一个结果集。 - Dave
请查看这个链接:http://www.codeproject.com/Questions/155444/how-to-display-data-from-sql-database-to-textbox-u。 - Mingebag
2
你缺少了 read.Read() 调用。 - V4Vendetta
你的表Pending_tasks里有日期吗?如果有,那么你应该先执行read.Read(),然后再赋值。 - Ehsan
您还可以将连接包装在 using 块中,以确保它被关闭。有些人建议仍然在 finally 中执行关闭操作。 - DOK
感谢所有有帮助的回答,结果我确实需要使用while(read.Read()),现在它完美地工作了!非常感谢! - Captain_Custard
5个回答

9
您的代码中缺少 reader.Read() 这一行,需要添加它。这个函数实际上是从数据库中读取数据的函数。
string conString = "Data Source=localhost;Initial Catalog=LoginScreen;Integrated Security=True";
SqlConnection con = new SqlConnection(conString);

string selectSql = "select * from Pending_Tasks";
SqlCommand com = new SqlCommand(selectSql, con);

try
{
    con.Open();

    using (SqlDataReader read = cmd.ExecuteReader())
    {
        while(reader.Read())
        {
            CustID.Text = (read["Customer_ID"].ToString());
            CustName.Text = (read["Customer_Name"].ToString());
            Add1.Text = (read["Address_1"].ToString());
            Add2.Text = (read["Address_2"].ToString());
            PostBox.Text = (read["Postcode"].ToString());
            PassBox.Text = (read["Password"].ToString());
            DatBox.Text = (read["Data_Important"].ToString());
            LanNumb.Text = (read["Landline"].ToString());
            MobNumber.Text = (read["Mobile"].ToString());
            FaultRep.Text = (read["Fault_Report"].ToString());
        }
    }
}
finally
{
    con.Close();
}

编辑:如果你想将最后一条记录写入你的文本框,那么这段代码是有效的。如果你想应用不同的场景,比如从数据库中读取所有记录,并在点击“下一个”按钮时更改文本框中的数据,你应该创建并使用自己的模型,或者如果愿意,你可以将数据存储在 DataTable 中以后引用。


2
如果有多行,这将覆盖文本框,直到读取最后一行。 - David S.
是的,我知道这个。他可以将第一个信息写入文本框,也可以写入最后一个信息。 - Adil Mammadov
我很高兴它对你有用。但请记住,如果文本框中有多行记录,它将覆盖这些记录。感谢@DavidS.的评论。 - Adil Mammadov

3
using (SqlConnection connection =  new SqlConnection("Data Source=localhost;Initial Catalog=LoginScreen;Integrated Security=True"))
{
    SqlCommand command =
    new SqlCommand("select * from Pending_Tasks WHERE CustomerId=...", connection);
    connection.Open();

    SqlDataReader read= command.ExecuteReader();

    while (read.Read())
    {
        CustID.Text = (read["Customer_ID"].ToString());
        CustName.Text = (read["Customer_Name"].ToString());
        Add1.Text = (read["Address_1"].ToString());
        Add2.Text = (read["Address_2"].ToString());
        PostBox.Text = (read["Postcode"].ToString());
        PassBox.Text = (read["Password"].ToString());
        DatBox.Text = (read["Data_Important"].ToString());
        LanNumb.Text = (read["Landline"].ToString());
        MobNumber.Text = (read["Mobile"].ToString());
        FaultRep.Text = (read["Fault_Report"].ToString());
    }
    read.Close();
}

请确保查询中有数据:select * from Pending_Tasks,并且您正在使用 "using System.Data.SqlClient;"。


2

read = com.ExecuteReader()

SqlDataReader有一个Read()函数,它从查询结果中读取下一行并返回一个布尔值表示是否找到下一行。因此,在实际获取读取器中的列之前,您需要检查它是否存在(它总是获取Read()获取到的当前行)。或者更好的方法是使用循环while(read.Read())如果您的查询返回多行。


@EhsanUllah 是的,操作者应该限制主键查询或以其他方式存储每个Read()的结果。 - David S.

0
如果你想将数据库中的单个值显示在文本框中,请参考下面的代码:
SqlConnection con=new SqlConnection("connection string");
SqlCommand cmd=new SqlConnection(SqlQuery,Con);
Con.Open();
TextBox1.Text=cmd.ExecuteScalar();
Con.Close();

或者

SqlConnection con=new SqlConnection("connection string");
SqlCommand cmd=new SqlConnection(SqlQuery,Con);
Con.Open();
SqlDataReader dr=new SqlDataReadr();
dr=cmd.Executereader();
if(dr.read())
{
    TextBox1.Text=dr.GetValue(0).Tostring();
}
Con.Close();

0
建立连接并打开它。
con = new OracleConnection("Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=<database_name>)));User Id =<userid>; Password =<password>");
con.Open();

编写查询语句:
string sql = "select * from Pending_Tasks";

创建一个命令对象:
OracleCommand cmd = new OracleCommand(sql, con);

执行命令并将结果放入对象中以便读取。

OracleDataReader r = cmd.ExecuteReader();

现在开始从它读取。

while (read.Read())
{
 CustID.Text = (read["Customer_ID"].ToString());
 CustName.Text = (read["Customer_Name"].ToString());
 Add1.Text = (read["Address_1"].ToString());
 Add2.Text = (read["Address_2"].ToString());
 PostBox.Text = (read["Postcode"].ToString());
 PassBox.Text = (read["Password"].ToString());
 DatBox.Text = (read["Data_Important"].ToString());
 LanNumb.Text = (read["Landline"].ToString());
 MobNumber.Text = (read["Mobile"].ToString());
 FaultRep.Text = (read["Fault_Report"].ToString());
}
read.Close();

也要添加 Oracle.ManagedDataAccess.Client;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接