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

5 に答える 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();
}

EDIT :このコードは、最後のレコードをテキスト ボックスに書き込みたい場合に機能します。たとえば、データベースからすべてのレコードを読み取り、Nextボタンをクリックしたときにテックスボックスのデータを変更するなど、別のシナリオを適用する場合は、独自のモデルを作成して使用するか、DataTable にデータを保存して必要に応じて後で参照してください。

于 2013-05-15T12:34:47.100 に答える
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;」を使用しています。

于 2013-05-15T12:38:09.773 に答える
2

read = com.ExecuteReader()

SqlDataReaderクエリの結果から次の行を読み取り、読み取る次の行が見つかったかどうかRead()を返す関数があります。boolそのため、実際にリーダーから列を取得する前に、それを確認する必要があります (リーダーは常に取得した現在の行を取得するだけですRead())。while(read.Read())または、クエリが複数の行を返す場合は、ループを作成することをお勧めします。

于 2013-05-15T12:33:08.550 に答える