1

在过去一周左右的时间里,我一直在构建一个连接到 Sql-Server 2008 数据库的 ASP 站点。我从来没有使用过存储过程,我想知道是否有人可以给我一些关于如何创建以及如何在 ASP 方法中使用它们的指导。我正在尝试使网站的代码尽可能简单和优雅。这是我试图更改为存储过程的代码:

    private void ExecuteInsert(string name, string type)
{
    SqlConnection conn = new SqlConnection(GetConnectionStringHM());
    string sql = "INSERT INTO tblSoftwareTitles (SoftwareName, SoftwareType) VALUES " 
        +"(@SoftwareName,@SoftwareSystemType)";

    try
    {
        conn.Open();
        SqlCommand cmd = new SqlCommand(sql, conn);
        SqlParameter[] param = new SqlParameter[2];
        //param[0] = new SqlParameter("@SoftwareID);
        param[0] = new SqlParameter("@SoftwareName", SqlDbType.NVarChar, 200);
        param[1] = new SqlParameter("@SoftwareType", SqlDbType.Int);

        param[0].Value = name;
        param[1].Value = type;

        for (int i= 0; i < param.Length; i++)
        {
            cmd.Parameters.Add(param[i]);
        }
        cmd.CommandType = CommandType.Text;
        cmd.ExecuteNonQuery();
    }
    catch (System.Data.SqlClient.SqlException ex)
    {
        string msg ="Insert Error:";
        msg += ex.Message;
        throw new Exception(msg);
    }

    finally
    {
        conn.Close();
    }

    }

这只是一个简单的插入,它从一个输入表单中获取两个参数并将它们插入到数据库中。对此的任何帮助将不胜感激,因为我觉得以后知道这将是一件有用的事情。提前致谢!

4

4 回答 4

4

您应该查看 MSDN 基础知识:http: //msdn.microsoft.com/en-us/library/bb896274.aspx

您不需要使用 for 循环使事情复杂化。

try
  {
     sqlConnection = new SqlConnection(dbConnectionString);
     SqlCommand command = new SqlCommand(sql, sqlConnection);
     command.CommandType = CommandType.StoredProcedure;
     command.Parameters.Add("@SoftwareName", SqlDbType.NVarChar, 200).Value = SoftwareNameHere;
     command.Parameters.Add("@SoftwareType",  SqlDbType.Int).Value = SoftwareTypeHere;
     sqlConnection.Open();
     return command.ExecuteNonQuery();
  }
catch (SqlException ex)
  {
     Console.WriteLine("SQL Error" + ex.Message.ToString());
     return 0;
  }
finally
  {
     conn.Close(); 
  }

如果您使用的是.NET 3.5 或更高版本,则可以使用USING负责处理资源的代码块。我不完全确定,但据我记得这是.NET 3.5引入的,以替换Try/Finally代码块(这需要开发人员通过代码手动处理连接对象等资源)。

using (SqlConnection con = new SqlConnection { dbConnectionString })
{
    con.Open();
    try
    {   
        using (SqlCommand command = new SqlCommand { CommandType = CommandType.StoredProcedure, Connection = con, CommandTimeout = 300, CommandText = "sp_Test" })      
        {
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.Add("@SoftwareName", SqlDbType.NVarChar, 200).Value = SoftwareNameHere;
            command.Parameters.Add("@SoftwareType",  SqlDbType.Int).Value = SoftwareTypeHere;

            command.ExecuteNonQuery();
        }
    }
    catch(SqlException ex)
    {
        //ex.ToString message here;
    }
}
于 2013-07-24T14:38:50.350 回答
1

您正在寻找的答案在这个 SO 帖子中......

https://stackoverflow.com/a/4561443/1246574

对于该帖子中接受的答案,我会改进的一件事是该答案中的示例不使用任何 USING 语句。最好在 USING 语句中包含连接和命令,以便自动处理它们。

另一种方法是使用 Microsoft Enterprise Library 与您的 SQL Server DB 进行交互。我认为这比使用普通的旧 SqlConnection 和 SqlCommand 更容易。

于 2013-07-24T14:37:58.070 回答
1

由于您的代码已经使用了参数,因此您已经完成了 90% 的工作。你所要做的就是:

  1. 将插入语句放入存储过程,保持与动态语句相同的参数定义。
  2. 更改CommandType.TextCommandType.StoredProcedure
  3. 将命令文本更改为存储过程的名称。
于 2013-07-24T14:40:37.493 回答
0

在阅读了一些关于这个主题的文章后,我遇到了一些有用的文章,它们确实质疑我对存储过程的需求。

本文给出了一个很好的观点,说明存储过程如何比帮助更麻烦,并且在编码、调试广告错误报告方面非常笨重和乏味。

http://www.codinghorror.com/blog/2004/10/who-needs-stored-procedures-anyways.html

这篇文章(链接在上面的文章中)很好地解释了参数化,解释了为什么它们对于降低 sql 注入的风险是必要的,并且还提出了这些参数化查询以与过程类似的方式缓存的观点,使它们具有可比性性能提升

http://www.uberasp.net/getarticle.aspx?id=46

我觉得在我的情况下,将参数化的 sql 查询编码到我的 ASP 页面中将是最明智的举措,因为这些页面将存储在服务器上并由客户端访问。我想如果这是安装在多台客户端计算机上硬编码的应用程序,SQL 将不是一个理想的选择,因此存储过程将是最好的方法(据我所知)

如果有兴趣,可以在此处找到对存储过程与参数化 sql 的后续操作,其中包含指向参数每一侧的不同链接。

http://www.codinghorror.com/blog/2005/05/stored-procedures-vs-ad-hoc-sql.html

希望这个小答案可以帮助其他考虑使用存储过程而不是参数化 SQL 的人,反之亦然

于 2013-07-24T16:07:11.033 回答