【问题标题】:How do I get values from a SQL database into textboxes using C#?如何使用 C# 从 SQL 数据库中获取值到文本框中?
【发布时间】:2013-05-15 12:29:41
【问题描述】:

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

我想在 DataGridView 中单击按钮时显示客户详细信息,但是当我单击按钮时,应用程序会引发异常并显示以下错误消息;

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

我已经附加了一个screenshot 的屏幕,我想在其中查看客户详细信息,以及按钮的代码,最终将在相应的文本框中显示客户详细信息。任何帮助将不胜感激!

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

【问题讨论】:

  • 你什么都没读!你执行它,但你不遍历阅读器!使用while(read.Read()) - 请注意,如果有超过 1 组结果,只会保存最后一组。
  • 在此处查看此链接codeproject.com/Questions/155444/…
  • 你错过了read.Read()电话
  • 您的表 Pending_tasks 中有日期吗?如果是,那么你应该先做 read.Read() 然后赋值
  • 您还可以将连接包装在 using 块中,以确保它被关闭。有些人建议最后还是做收盘。

标签: c# sql ado.net sqldatareader


【解决方案1】:

您的代码中缺少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();
}

编辑: 假设您想将最后一条记录写入文本框,则此代码有效。如果您想应用不同的场景,例如从数据库中读取所有记录并在单击 Next 按钮时更改 texboxes 中的数据,您应该创建并使用自己的模型,或者您可以将数据存储在数据表,如果您愿意,稍后可以参考它们。

【讨论】:

  • 如果有多行,这将覆盖文本框,直到最后一行被读取。
  • 是的,我知道这一点。他可以将第一个信息写入文本框或最后一个。
  • 我很高兴它对你有用。但请记住,如果有超过一行,它将覆盖文本框中的记录。谢谢@DavidS。供评论
【解决方案2】:
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;”

【讨论】:

    【解决方案3】:

    read = com.ExecuteReader()

    SqlDataReader 有一个函数Read() 从查询结果中读取下一行并返回bool,无论它是否找到下一行要读取。因此,您需要在实际从阅读器那里获取列之前检查这一点(它总是只获取Read() 得到的当前行)。或者如果您的查询返回多行,最好创建一个循环while(read.Read())

    【讨论】:

    • @EhsanUllah 是的,OP 应该限制对主键的查询或以另一种方式存储来自每个 Read() 的结果
    【解决方案4】:

    如果你想显示从数据库到文本框的单值访问,请参考下面的代码:

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

    【讨论】:

      【解决方案5】:

      建立连接并打开它。

      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;

      添加它

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-24
        • 1970-01-01
        • 1970-01-01
        • 2015-03-11
        • 1970-01-01
        • 1970-01-01
        • 2011-07-17
        • 1970-01-01
        相关资源
        最近更新 更多