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();

在这三种方式中,哪一种是网站中最优化的使用方式??

asp.net c#中数据库中的优化插入过程

您展示的唯一不易受到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