asp.net c# 中的数据读取器错误
datareader error in asp.net c#
我在从数据库中选择一些数据并将数据保存到文本框中时遇到问题。我有以下配置文件 table:
if (Session["User"] != null)
{
try
{
string user = Session["User"].ToString();
SqlConnection conn = new SqlConnection(@"Data Source=localhost;Initial Catalog=SKRIPSI;User ID=sa;Password=sa");
conn.Open();
string biodata = "select * from mahasiswa where id='"+user+"'";
SqlCommand comm = new SqlCommand(biodata, conn);
SqlDataReader reader = comm.ExecuteReader();
while (reader.Read())
{
txtid.Text = reader["id"].ToString();
txtnama.Text = reader["nama"].ToString();
txtemail.Text = reader["email"].ToString();
txtkontak.Text = reader["kontak"].ToString();
txtalamat.Text = reader["password"].ToString();
}
reader.Close();
conn.Close();
}
catch (Exception ex)
{
Response.Write(ex.ToString());
}
}
else
{
Response.Redirect("Login_Form.aspx");
}
根据我的编码经验,这是正确的。但是调用 while(reader.Read())
时出现错误。这是错误异常。
System.Data.SqlClient.SqlException (0x80131904): Conversion failed when converting the varchar value 'System.Web.UI.WebControls.TextBox' to data type int. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action
1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,Boolean breakConnection,Action1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.SqlDataReader.TryHasMoreRows(Boolean& moreRows) at System.Data.SqlClient.SqlDataReader.TryReadInternal(Boolean setTimeout, Boolean& more) at System.Data.SqlClient.SqlDataReader.Read() at Skripsi.Mahasiswa.Page_Load(Object sender, EventArgs e) in C:\Users\Henz\documents\visual studio 2015\Projects\Skripsi\Skripsi\Mahasiswa.aspx.cs:line 26 ClientConnectionId:aebdd470-263a-43a9-a7f3-12885668d946 Error Number:245,State:1,Class:16
请帮我解决这个问题。我还是个初学者。谢谢。
如果您得到单行,请使用 if(reader.read())。 while(reader.read()) 可能会循环,当查询出错时,它常常会给人们带来麻烦。
您的数据库中有可为空的类型。不过,您没有检查空值。在设置字段之前使用 IsDBNull() 方法。你必须经过一个额外的步骤,因为它只接受一个整数。
if(!reader.IsDBNull(reader.GetOrdinal("nama"))
{
txtid.Text = reader["id"].ToString();
}
此外,在您的 sql 语句中,您的 id 连接用单引号引起来。 id 列被定义为一个 int,将它添加到单引号中将被视为一个字符串。
string biodata = "select * from mahasiswa where id="+user+"";
请记住,这种字符串连接方法可确保您的网站对 sql 注入攻击开放,并且它的编写方式可以很容易地制作出 sql 内容整个table,甚至删除数据库的内容。
我在从数据库中选择一些数据并将数据保存到文本框中时遇到问题。我有以下配置文件 table:
if (Session["User"] != null)
{
try
{
string user = Session["User"].ToString();
SqlConnection conn = new SqlConnection(@"Data Source=localhost;Initial Catalog=SKRIPSI;User ID=sa;Password=sa");
conn.Open();
string biodata = "select * from mahasiswa where id='"+user+"'";
SqlCommand comm = new SqlCommand(biodata, conn);
SqlDataReader reader = comm.ExecuteReader();
while (reader.Read())
{
txtid.Text = reader["id"].ToString();
txtnama.Text = reader["nama"].ToString();
txtemail.Text = reader["email"].ToString();
txtkontak.Text = reader["kontak"].ToString();
txtalamat.Text = reader["password"].ToString();
}
reader.Close();
conn.Close();
}
catch (Exception ex)
{
Response.Write(ex.ToString());
}
}
else
{
Response.Redirect("Login_Form.aspx");
}
根据我的编码经验,这是正确的。但是调用 while(reader.Read())
时出现错误。这是错误异常。
System.Data.SqlClient.SqlException (0x80131904): Conversion failed when converting the varchar value 'System.Web.UI.WebControls.TextBox' to data type int. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action
1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,Boolean breakConnection,Action1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.SqlDataReader.TryHasMoreRows(Boolean& moreRows) at System.Data.SqlClient.SqlDataReader.TryReadInternal(Boolean setTimeout, Boolean& more) at System.Data.SqlClient.SqlDataReader.Read() at Skripsi.Mahasiswa.Page_Load(Object sender, EventArgs e) in C:\Users\Henz\documents\visual studio 2015\Projects\Skripsi\Skripsi\Mahasiswa.aspx.cs:line 26 ClientConnectionId:aebdd470-263a-43a9-a7f3-12885668d946 Error Number:245,State:1,Class:16
请帮我解决这个问题。我还是个初学者。谢谢。
如果您得到单行,请使用 if(reader.read())。 while(reader.read()) 可能会循环,当查询出错时,它常常会给人们带来麻烦。
您的数据库中有可为空的类型。不过,您没有检查空值。在设置字段之前使用 IsDBNull() 方法。你必须经过一个额外的步骤,因为它只接受一个整数。
if(!reader.IsDBNull(reader.GetOrdinal("nama"))
{
txtid.Text = reader["id"].ToString();
}
此外,在您的 sql 语句中,您的 id 连接用单引号引起来。 id 列被定义为一个 int,将它添加到单引号中将被视为一个字符串。
string biodata = "select * from mahasiswa where id="+user+"";
请记住,这种字符串连接方法可确保您的网站对 sql 注入攻击开放,并且它的编写方式可以很容易地制作出 sql 内容整个table,甚至删除数据库的内容。