2 回答

TA貢獻1806條經(jīng)驗 獲得超5個贊
下面的邏輯嘗試盡可能接近您的實現(xiàn),但在處理數(shù)據(jù)庫連接時要考慮最佳實踐:
// You will need the following namespaces:
// using System;
// using System.Data;
// using System.Data.SqlClient;
// using System.Windows.Forms;
var connectionString = "Your SQL Server connection string";
using (var con = new SqlConnection(connectionString))
{
con.Open();
var cmd = con.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText =
"INSERT INTO Tbl_Attendance (Course, Subject, Year, Section, Name, Room, SeatNo, Status, Date) " +
"VALUES (@Course, @Subject, @Year, @Section, @Name, @Room, @SeatNo, @Status, @Date)";
var courseParam = cmd.Parameters.Add("@Course", SqlDbType.VarChar, 50);
var subjectParam = cmd.Parameters.Add("@Subject", SqlDbType.VarChar, 50);
var yearParam = cmd.Parameters.Add("@Year", SqlDbType.VarChar, 50);
var sectionParam = cmd.Parameters.Add("@Section", SqlDbType.VarChar, 50);
var nameParam = cmd.Parameters.Add("@Name", SqlDbType.VarChar, 50);
var roomParam = cmd.Parameters.Add("@Room", SqlDbType.VarChar, 50);
var seatNoParam = cmd.Parameters.Add("@SeatNo", SqlDbType.VarChar, 50);
var statusParam = cmd.Parameters.Add("@Status", SqlDbType.VarChar, 50);
var dateParam = cmd.Parameters.Add("@Date", SqlDbType.DateTime);
dateParam.Value = DateTime.Now;
// If you are going to insert a lot of records, it's advised to call the Prepare method on your SqlCommand.
// Un-comment the line below if you want to see how this behaves.
// cmd.Prepare();
foreach (DataGridViewRow row in dgEdit.Rows)
{
courseParam.Value = row.Cells[0].Value;
subjectParam.Value = row.Cells[1].Value;
yearParam.Value = row.Cells[2].Value;
sectionParam.Value = row.Cells[3].Value;
nameParam.Value = row.Cells[4].Value;
roomParam.Value = row.Cells[5].Value;
seatNoParam.Value = row.Cells[6].Value;
statusParam.Value = row.Cells[7].Value;
cmd.ExecuteNonQuery();
}
}
MessageBox.Show("Updated! please check the report", "Save", MessageBoxButtons.OK, MessageBoxIcon.Information);
更改背后的原因:
如果可能,請在語句中實例化并打開 SqlConnection 連接。這將確保在作用域中完成連接時,始終關(guān)閉(釋放)連接。
using
在與任何外部輸入交互時,始終在查詢中使用參數(shù),以避免Bobby的媽媽被利用!(https://xkcd.com/327/)。這將確保您的代碼不容易受到 SQL 注入的影響。如您所見,我添加了一些參數(shù),但是由于您沒有提供我當時創(chuàng)建的表架構(gòu),因此除了很明顯您正在保存.請根據(jù)需要隨意將 更改為正確的類型。
VARCHAR(50)
@Date
System.DateTime
SqlDbType.VarChar
我將呼叫移到了范圍之外,因此它不會干擾連接處理。
MessageBox.Show
using
可以對此邏輯執(zhí)行的另一項增強功能是實現(xiàn)類的使用(必須添加對 System.Transactions 的引用.dll),以確保如果在任何插入過程中出現(xiàn)錯誤,則沒有任何內(nèi)容進入數(shù)據(jù)庫。System.Transactions.TransactionScope
committed

TA貢獻1789條經(jīng)驗 獲得超10個贊
您的原型是正確的,但您犯了一個錯誤,返回一個 Object,必須將其轉(zhuǎn)換為或表中可能匹配的列數(shù)據(jù)。dgvAtt.Rows[i].Cells[0].Value
ToString()
假設(shè)這是我的形式
我創(chuàng)建了一個表“人員”
代碼源碼
private void button1_Click(object sender, EventArgs e)
{
try
{
SqlCommand cmd = new SqlCommand();
cmd = con.CreateCommand();
for (int i = 0; i < dgvAtt.Rows.Count - 1; i++)
{
con.Open();
cmd.CommandType = CommandType.Text;
string Query = "INSERT INTO Person (idPerson, fullnamePerson) VALUES (" + dgvAtt.Rows[i].Cells[0].Value.ToString() + ",'" + dgvAtt.Rows[i].Cells[1].Value.ToString() + "')";
cmd.CommandText = Query;
cmd.ExecuteNonQuery();
con.Close();
}
MessageBox.Show("Updated! please check the report", "Save", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
不要編寫任何參數(shù),因為這會給你一個例外。
- 2 回答
- 0 關(guān)注
- 149 瀏覽
添加回答
舉報