【问题标题】:How to avoid duplication in sql connection and execute command如何避免sql连接重复并执行命令
【发布时间】:2014-05-28 10:24:43
【问题描述】:

我可以使用这个循环给我一个名字列表:

string commandText = @"SELECT ....;";

string connectionString = ConfigurationSettings.AppSettings["connectionString"];

using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlCommand command = new SqlCommand(commandText, connection);
    try
    {
         connection.Open();                        
         using (SqlDataReader reader = command.ExecuteReader())
         {
             DataTable dt = new DataTable();
             dt.Load(reader);

             for (int i = dt.Rows.Count - 1; i >= 0; i--)
             {                               
                 SqlCommand addresscommand = new SqlCommand(address, connection);
                 addresscommand.Parameters.AddWithValue("@companyName", dt.Rows[i][0].ToString());
                 SqlDataReader addressreader = command.ExecuteReader();
                 string address = addressreader.GetString(0);
              }
          }
     }
     catch (Exception ex)
     {

     }
}

所以dt.Rows[i][0].ToString() 是我需要添加到所有不同的sql 命令的名称。所以在那个 for 循环中,我将通过执行每个 sql 命令一个一个地获取每个值:

SqlCommand addresscommand = new SqlCommand(address, connection);
addresscommand.Parameters.AddWithValue("@companyName", dt.Rows[i][0].ToString());
SqlDataReader addressreader = addresscommand.ExecuteReader();
string comaddress = addressreader.GetString(0);
SqlCommand keyProcessescommand = new SqlCommand(keyProcesses, connection);
keyProcessescommand.Parameters.AddWithValue("@companyName", dt.Rows[i][0].ToString());
SqlDataReader keyProcessesreader = keyProcessescommand.ExecuteReader();
string comkeyProcesses = keyProcessesreader.GetString(0);
SqlCommand standardscommand = new SqlCommand(standards, connection);
standardscommand.Parameters.AddWithValue("@companyName", dt.Rows[i][0].ToString());
SqlDataReader standardsreader = standardscommand.ExecuteReader();
string comstandards = standardsreader.GetString(0);

其中的命令字符串由:

 string address = @"SELECT address FROM Companies where companyName = @companyName";

 string keyProcesses = @" SELECT distinct STUFF((SELECT ', '+ cn.name  from WMCCMCategories cn 

           INNER JOIN CategorySets uc ON uc.categoryId = cn.categoryID 
           INNER JOIN KeyProcesses u ON u.categorySetId = uc.setId
           INNER JOIN Companies c ON c.companyId = u.companyId
           WHERE c.companyName = @companyName 
           ORDER BY cn.name
           FOR XML PATH('')), 1, 1, '') AS listStr
           FROM WMCCMCategories cnn Group by cnn.name";

 string standards = @" SELECT cn.name from WMCCMCategories cn 
               INNER JOIN CategorySets uc ON uc.categoryId = cn.categoryID 
               INNER JOIN Companies c ON c.standards = uc.setId
               WHERE c.companyName = @companyName";

我可以像上面那样执行多个 sql 命令吗?最好的方法是如何做到这一点?

【问题讨论】:

  • 为什么我觉得这可以通过一个简单的 JOIN 语句来解决?
  • 如您所见,地址、keyProcesses 可以从相同的 sql 查询和 join statemet 中获取(只是我猜的,没有尝试过)。但看起来标准无法从同一个 sql 中获取,因为两个表“Companies and CategorySets 按标准、categorySetId 和 setId 链接。所以如果使用相同的 sql,我认为会有冲突。

标签: c# sql asp.net-mvc


【解决方案1】:

您可以通过 SQL 中的 JOIN 来解决此问题。但是,如果它不代表相同的列,则可能不是正确的做法。

现在就在一个命令中使用多项选择而言。是的,您可以将 SqlDataReader 与 NextResult() 一起使用

请看这个链接:

http://csharp.net-informations.com/data-providers/csharp-multiple-resultsets.htm

【讨论】:

  • 我看到 NextResult 的定义适合我的情况,但是在您的示例链接中,我没有看到不同的 sql 查询。下一个结果如何应用于我的案件?谢谢!
  • 因为在我的 sql 命令中我需要稍后将变量值传输到其中,所以它与您的示例完全不同。我不能这样写:sql = @"SELECT cn.companyName from Companies cn INNER JOIN KeyProcesses uc ON uc.companyId = cn.companyId WHERE uc.description like '%" + ProcessInputClause + "%';"; @"SELECT address FROM Companies where companyName = @companyName";
  • 如何使用我的 sql 注入,例如:command.Parameters.AddWithValue("@companyName", dt.Rows[i][0].ToString());用你的 nextresult() 方法?
猜你喜欢
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
  • 2013-06-30
相关资源
最近更新 更多