予約管理システムを作成していますが、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();
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
ボタンをクリックしたときにtexbox内のデータを変更するなど、別のシナリオを適用する場合は、独自のモデルを作成して使用する必要があります。データをDataTableに保存し、必要に応じて後で参照します。
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 Presidenting_Tasksそして「usingSystem.Data.SqlClient;」を使用しています
read = com.ExecuteReader()
SqlDataReader
には関数Read()
があり、クエリの結果から次の行を読み取り、読み取る次の行が見つかったかどうかに関係なくbool
を返します。したがって、実際にリーダーから列を取得する前に、それを確認する必要があります(これは、常にRead()
が取得した現在の行を取得するだけです)。または、クエリが複数の行を返す場合は、ループwhile(read.Read())
を作成することをお勧めします。
データベースからテキストボックスへの単一値アクセスを表示する場合は、以下のコードを参照してください。
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();