asp.net c#中数据库中的优化插入过程
本文关键字:优化 插入 过程 数据库 net asp | 更新日期: 2023-09-27 18:00:33
我使用的是asp.net 4和visualstudio 2010以及ms-sql-server2008express。我使用了三种不同的方法将数据插入数据库表:
方式1:
DataSet dsTab = new DataSet("Table1");
SqlDataAdapter adp = new SqlDataAdapter("Select * from Table1", con);
adp.Fill(dsTab, "Table1");
DataRow dr = dsTab.Tables["Table1"].NewRow();
dr["col1"] = txtBox1.Text;
dr["col2"] = txtBox5.Text;
dr["col3"] = User.Identity.Name.ToString();
dr["col4"] = "text";
dr["col5"] = DateTime.Now;
dr["col6"] = txtBox3.Text;
dr["col7"] = txtBox2.Text;
dsTab.Tables["Table1"].Rows.Add(dr);
SqlCommandBuilder projectBuilder = new SqlCommandBuilder(adp);
DataSet newSet = dsTab.GetChanges(DataRowState.Added);
adp.Update(newSet, "Table1");
方式2:
SqlDataAdapter AdapterMessage = new SqlDataAdapter();
AdapterMessage.InsertCommand = new SqlCommand();
AdapterMessage.InsertCommand.Connection = con;
AdapterMessage.InsertCommand.CommandText = "insert into Table1(col1,col2,col3,col4,col5,col6,col7) values ('" + txtBox1.Text + "','" + txtBox5.Text + "','" + User.Identity.Name.ToString(); + "','text','" + DateTime.Now + "','" + txtBox3.Text + "','" + txtBox2.Text + "')";
AdapterMessage.InsertCommand.ExecuteNonQuery();
AdapterMessage.Dispose();
方式3:
string query = "insert into Table1(col1,col2,col3,col4,col5,col6,col7) values ('" + txtBox1.Text + "','" + txtBox5.Text + "','" + User.Identity.Name.ToString(); + "','text','" + DateTime.Now + "','" + txtBox3.Text + "','" + txtBox2.Text + "')";
int i;
SqlCommand cmd = new SqlCommand(query);
con.open();
i = cmd.ExecuteNonQuery();
con.close();
在这三种方式中,哪一种是网站中最优化的使用方式??
您展示的唯一不易受到SQL注入攻击的示例是#1。
由于其他两个都很脆弱,#1是你唯一的选择(在你介绍的三个选项中)。返回代码并立即修复#2或#3的任何示例。如果你不这样做,你的网站将被黑客入侵。
你有没有看到你尝试过的各种方法之间的性能问题?如果不是这样,你会花时间保护你的网站,而不是过度设计你的代码。
看看SqlParameter类。这是向SQL Server提交参数化查询的正确方式,并且在正确使用时消除了SQL注入攻击的可能性。
也就是说,如果这是我的代码,我就不会使用这些选项中的任何一个。以下是我认为最好的方法的伪代码:
using (SqlConnection connection = new SqlConnection(
connectionString))
{
SqlCommand command = new SqlCommand(queryString, connection);
//add parameters here
command.Connection.Open();
command.ExecuteNonQuery();
}
如果要插入多行,则可以使用SqlBulkCopy对象。一个简单的例子:
DataTable dt = new DataTable();
SqlConnection oConn = new SqlConnection();
SqlBulkCopy sbc = new SqlBulkCopy(oConn);
sbc.DestinationTableName = "dbo.SomeTable";
sbc.WriteToServer(dt);
sbc.Close();
请记住,DataTable
的模式必须是要插入的数据库表的模式。
方法#1:数据集不是对象,这是我唯一的抱怨。
方法#2:SQL注入噩梦!!!SQL注入
方法#3:仍然适用于SQL注入
如何扩展#3:
-
使用SqlParameters避免SQL注入问题。
-
不传递表单中的值直接进入查询,直到它们经过验证。
另外,使用相关名称命名变量,我在下面的示例中这样做了,但我的名称很糟糕,因为我不知道您试图插入的数据的详细信息。
public static void InsertRecordBasedOnView(String goodNameForTextBoxOne, String goodNameForTextBoxTwo, String goodNameForTextBoxFive, String goodNameForTextBoxThree, String userName)
{
const string query = "insert into Table1(col1,col2,col3,col4,col5,col6,col7) values (@valueOne, @valueTwo, @valueThree, @valueFour, @valueFive, @valueSix, @valueSeven)";
SqlParameter columnOne = new SqlParameter("@valueOne", SqlDbType.NVarChar);
SqlParameter columnTwo = new SqlParameter("@valueTwo", SqlDbType.NVarChar);
SqlParameter columnThree = new SqlParameter("@valueThree", SqlDbType.NVarChar);
SqlParameter columnFour = new SqlParameter("@valueFour", SqlDbType.NVarChar);
SqlParameter columnFive = new SqlParameter("@valueFive", SqlDbType.DateTime);
SqlParameter columnSix = new SqlParameter("@valueSix", SqlDbType.NVarChar);
SqlParameter columnSeven = new SqlParameter("@valueSeven", SqlDbType.NVarChar);
columnOne.Value = goodNameForTextBoxOne;
columnTwo.Value = goodNameForTextBoxFive;
columnThree.Value = userName;
columnFour.Value = "Text";
columnFive.Value = DateTime.Now;
columnSix.Value = goodNameForTextBoxThree;
columnSeven.Value = goodNameForTextBoxTwo;
SqlCommand cmd = new SqlCommand(query);
cmd.Parameters.Add(columnOne);
cmd.Parameters.Add(columnTwo);
cmd.Parameters.Add(columnThree);
cmd.Parameters.Add(columnFour);
cmd.Parameters.Add(columnFive);
cmd.Parameters.Add(columnSix);
cmd.Parameters.Add(columnSeven);
using (SqlConnection connection = new SqlConnection(someConnectionString))
{
connection.Open();
cmd.ExecuteNonQuery();
}
}
取决于数据量(单个或批量),但我认为SqlCommand可能开销最小。其他2个示例创建了一个基本插入不需要的附加DataTable或DataAdapter。
我还将研究存储过程(使用SqlCommand),因为这将是我个人的选择
SQL Server 2008支持多行插入,如下所示:
INSERT INTO MyTable (FirstCol, SecondCol)
VALUES ('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)
这可能会消除一些开销。
我认为你可以在数据库中使用视图!,或者像这样的EntityFramework
实体;
using (var context = new ADO_NET_Entities())
{
var newDataset = new stuff();
stuff.row1InDatatable = "Something";
stuff.row2InDatable = "Something";
stuff.row3InInDatatable = "Something";
context.stuff.AddObject(newDataset);
context.SaveChanges();
}
这里有更多;http://msdn.microsoft.com/en-us/library/aa697427(v=vs.80).aspx