我試圖將我擁有的憑證ID和憑證金額的SQL資料存盤到一個變數中,并在點擊按鈕時將其顯示在一個標簽中。
protected void Button1_Click(物件 sender, EventArgs e)
{
string voucherId = String.Empty。
string voucherAmount =String.Empty;
string queryVoucherId = "select voucherid from ReturnForm where email = '" Session["username"] "' 。 "。
string queryVoucherAmount = "select voucheramount from ReturnForm where email = '" Session["username"] "' 。 "。
int index = 0。
using (SqlConnection con = new SqlConnection(str)
{
SqlCommand cmd = new SqlCommand(queryVoucherId, con)。
con.Open()。
SqlDataReader reader = cmd.ExecuteReader()。
while (reader.Read())
{
voucherId = reader[index].ToString();
index ;
}
}
using (SqlConnection con = new SqlConnection(str)
{
SqlCommand cmd = new SqlCommand(queryVoucherAmount,con)。
con.Open()。
SqlDataReader reader = cmd.ExecuteReader()。
while (reader.Read())
{
voucherAmount = reader[index].ToString();
index ;
}
}
if (txtVoucher.Text == voucherId)
{
Label3.Visible = true;
Label3.Text = voucherAmount。
}
當我點擊按鈕時,它給我一個錯誤,說索引超出了范圍。
uj5u.com熱心網友回復:
基于@JSGarcia的回答--但使用引數作為一個ALWAYS應該--你會得到以下代碼:
string email = Session['username'] 。
string query = $"SELECT voucherid, voucheramount FROM ReturnFrom WHERE Email = @email"/span>;
DataTable dt = new DataTable()。
using (SqlConnection conn = new SqlConnection(connectionString)
using (SqlCommand cmd = new SqlCommand(query, conn))
using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
{
//在打開連接前設定引數。
//這也定義了引數的型別和長度 - 這里只是一個猜測,可能需要改變這個。
cmd.Parameters.Add("@email", SqlDbType.VarChar, 100).Value = email;
conn.Open();
sda.Fill(dt);
conn.Close();
}
就個人而言,我寧愿使用像
這樣的資料類。public class VoucherData
{
public int Id { get; set; }
public Decimal Amount { get; set; }
然后從你的SQL查詢中得到一個List<VoucherData>(使用例如Dapper):
string query = $"SELECT Id, Amount FROM ReturnFrom WHERE Email = @email"/span>;
List<VoucherData> vouchers = conn. Query<VoucherData>(query).ToList()。
我會盡量避免使用相當笨重和不容易使用的DataTable結構...
uj5u.com熱心網友回復:
我強烈建議將你的sql查詢合并成一個單一的查詢,將其寫入一個資料表,并從那里繼續你的邏輯。我認為這樣的代碼會更簡潔:
string email = Session['username']。
string query = $"SELECT voucherid, voucheramount FROM ReturnFrom where Email = '{email}'"/span>。
DataTable dt = new DataTable()。
using (SqlConnection conn = new SqlConnection(connectionString)
using (SqlCommand cmd = conn.CreateCommand() )
using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
{
cmd.CommandText = query;
cmd.CommandType = CommandType.Text;
conn.Open();
sda.Fill(dt);
conn.Close()。
}
//從這里開始使用DataTable dt。
...
uj5u.com熱心網友回復:
那么,還有一個重要的提示? 如果你要更新資料表,一般來說你只需要一個dataadaptor。
如果你說不使用 sql 命令物件,你只需要一個新的連接物件。
sqlcommand物件有:
a connection object - no need to createa separate one
a讀者 - 不需要創建a獨立的一個。
注意我沒有創建一個單獨的連接物件,而是使用了命令物件中內置的連接物件。
既然引數在兩種情況下都是一樣的?那么為什么不重復使用它呢!
因此,我們得到了這樣的結果。
因此,我們得到了這樣的結果:
void TestFun2()
{
String str = "some conneciton? ?"。
DataTable rstVouch = new DataTable()。
using (SqlCommand cmdSQL =)
new SqlCommand("select voucherid from ReturnForm where email = @email",
new SqlConnection(str)>)
{
cmdSQL.Parameters.Add("@email", SqlDbType.NVarChar).Value = Session["username"] 。
cmdSQL.Connection.Open()。
rstVouch.Load(cmdSQL.ExecuteReader())。
// now get vouch amount[/span
cmdSQL.CommandText = "select voucheramount from ReturnForm where email = @email" 。
DataTable rstVouchAmount = new DataTable()。
rstVouchAmount.Load(cmdSQL.ExecuteReader())。
if (rstVouch.Rows[0]["vourcherid"] .ToString() == txtVoucher.Text)
{
Label3.Visible = true;
Label3.Text = rstVouchAmount.Rows[0]["voucheramount"].ToString()。
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/332275.html
標籤:
