【问题标题】:Send an Unspecified Number of Parameters to a Method向方法发送未指定数量的参数
【发布时间】:2016-01-25 17:23:30
【问题描述】:

我有一个程序,目前被硬编码以发送一些用户输入到 DBF 文件中的参数。我不能将参数留空(DBF 似乎不允许这样做),所以现在我只是输入一个空白,这不一定是问题。

这是目前为止的方法;

    public bool SendToDBF(string name, string town, string pcode)
    {

        int id, querytype, personID;
        string whatfile, netname, whatProgram, blank;

        id = 1;
        whatfile = "Compns";
        querytype = 1;
        netname = Environment.UserName;
        personID = 8948;
        whatProgram = "Sales";
        blank = "";

        try
        {
            string constr = ConfigurationManager.ConnectionStrings["dbfString"].ConnectionString;
            using (var dbfCon = new OleDbConnection(constr))
            {
                dbfCon.Open();
                var dbfCmd = new OleDbCommand("INSERT INTO fromsql VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", dbfCon);
                dbfCmd.Parameters.Clear();
                dbfCmd.Parameters.AddWithValue("@fq_uniqid", id);
                dbfCmd.Parameters.AddWithValue("@fq_whfile", whatfile);
                dbfCmd.Parameters.AddWithValue("@fq_what", querytype);
                dbfCmd.Parameters.AddWithValue("@fq_whonm", netname);
                dbfCmd.Parameters.AddWithValue("@fq_whoid", personID);
                dbfCmd.Parameters.AddWithValue("@fq_whoprog", whatProgram);
                dbfCmd.Parameters.AddWithValue("@param1", name);
                dbfCmd.Parameters.AddWithValue("@param2", town);
                dbfCmd.Parameters.AddWithValue("@param3", pcode);
                dbfCmd.Parameters.AddWithValue("@param4", blank);
                dbfCmd.Parameters.AddWithValue("@param5", blank);
                dbfCmd.Parameters.AddWithValue("@param6", blank);
                dbfCmd.Parameters.AddWithValue("@param7", blank);
                dbfCmd.Parameters.AddWithValue("@param8", blank);
                dbfCmd.Parameters.AddWithValue("@param9", blank);
                dbfCmd.Parameters.AddWithValue("@param10", blank);
                dbfCmd.Parameters.AddWithValue("@param11", blank);
                dbfCmd.Parameters.AddWithValue("@param12", blank);
                dbfCmd.Parameters.AddWithValue("@param13", blank);
                dbfCmd.Parameters.AddWithValue("@paraml1", blank);
                dbfCmd.Parameters.AddWithValue("@paraml2", blank);

                dbfCmd.ExecuteNonQuery();
                return true;
            }
        }
        catch (OleDbException ex)
        {
            MessageBox.Show("Error Updating MySQL: " + ex);
            return false;
        }
    }

我希望发送给 DBF 的参数数量取决于用户为公司填写的字段数量,例如,如果他们只填写姓名、城镇和邮政编码,则 SendToDBF 将占用 3 @ 987654322@以及IDWhatfileQueryType等预定义参数。

有没有一种方法可以让 SendToDBF 采用未指定数量的参数,并用空格填充用户未输入的其余参数?

【问题讨论】:

  • 按需构建 SQL 语句。只需自己连接语句。这是非常棘手的代码。
  • 为什么不创建一个 List 或创建一个处理字段总数的类,当您将类作为参数传递时,您可以使用 AddWithValue 方法正确填写参数.. 并且对于那些为空的分配 string.Empty 作为参数
  • @MethodMan 我会使用Dictionary<string, object>
  • Dictionary 也可以,我也用过..也 @CBreeze MessageBox.Show("Error Updating MySQL: " + ex); 更改为 MessageBox.Show("Error Updating MySQL: " + ex.Message);
  • 我会使用 C# params 关键字(public bool SendToDBF(params string[] parameters)。插入语句需要在参​​数数组中的每个项目都有一个“?”。

标签: c# methods oledb foxpro


【解决方案1】:

如果类型始终为string,您可以使用params keyword in C#

public static void TestParams(params string[] Params)
{
   foreach (string param in Params) 
    {
        Console.WriteLine(param);
    }
}

然后根据Params中的索引决定值名

例子:

public static void TestParams(params string[] Params)
{
    // init dbf up here
    int maxParams = 12;
    for(int i = 1; i <= maxParams; i++) 
    {
        string paramName = "@param" + i;
        if(Params.Length >= i)
            dbfCmd.Parameters.AddWithValue(paramName, Params[i - 1]); // array index is zero-based
        else
            dbfCmd.Parameters.AddWithValue(paramName, blank);
    }
}

【讨论】:

  • 然后根据Params中的索引来决定值名——我不确定我是否理解这句话。你介意扩大一点吗?
  • @CBreeze 例如,如果您总是希望它们按 NameCompanyCountry、param1、param2 等,名称将始终为 Params[0](如果存在),公司将始终为 Params[1] 等等。添加示例
  • @MathiasR.Jessen 如果我遍历 Params 并将它们一一添加到带有 Parameters.AddWithValue() 的语句中,那么这不会解决用空白替换其余参数的问题会吗?
  • @CBreeze 否,但您也可以添加第二个循环来添加这些空白值,如果这是您拥有的列数,则从 Params.Length 计数到 12
  • 呃...如果您提前知道所有参数代表什么,那么可选参数是一个更好的解决方案。
【解决方案2】:

我不知道你的问题的确切背景,但你可以:

  1. 将您的参数列表转换为带有键/值的字典(字典或字典),这样您就可以将确切的参数传递给您的方法,这样您就不会混淆每个参数的顺序。

所以你会有一个

new Dictionary<string, string> { {"firstName": "John"}, {"age": "42"} }

对于其余的参数,有一个带有键的数组,您可以在其上进行比较并用空白填充剩余的(我猜您的过程需要所有参数)

或另一种选择:使用包含所有参数的默认字典,每列都有默认值:

new Dictionary<string, string> { "status": "1" }

然后您只需将默认值与参数合并,然后将所有键和值添加到命令中。

见:Merging dictionaries in C#

  1. 如果顺序对参数不重要(我对此表示怀疑),您可以使用 params 关键字。请参阅Why use the params keyword? 了解何时使用。

【讨论】:

    【解决方案3】:

    你可以使用params:

    public bool SendToDBF(params  string[] parameters)
    {
    
    }
    
    public bool SendToDBF(params  object[] parameters)
    {
    
    }
    

    【讨论】:

      【解决方案4】:

      我会构建一个字段名称和值的字典,并自己构建 SQL。您可以从方法中传入字典,也可以在内部构建它。

      Dictionary<string, object> d = new Dictionary<string, object>();
      
      d["personID"] = 1234;
      // ...
      

      SQL 可以这样构建:

      StringBuilder sb = new StringBuilder();
      sb.Append("insert into ");
      sb.Append(tableName);
      sb.Append(" (");
      
      StringBuilder sbValues = new StringBuilder();
      sbValues.Append("values (");
      
      bool first = true;
      foreach (KeyValuePair<string, object> kvp in d)
      {
          if (first)
          {
              first = false;
          }
          else
          {
              sb.Append(", ");
              sbValues.Append(", ");
          }
      
          sb.Append(kvp.Key);
          sbValues.Append("?");
      
          // put the value in a SQL parameter;
          dbfCmd.Parameters.AddWithValue("@" + kvp.Key, kvp.Value);
      }
      
      sb.Append(") ");
      sbValues.Append(")");
      
      sb.Append(sbValues.ToString());
      
      string fullSql = sb.ToString();
      

      它将构建值字符串和 SQL 语句的其余部分分开,因为否则您需要检查集合两次,这似乎没有必要。

      【讨论】:

      • 如果语句中的? 参数多于字典中的参数,我将如何使用此方法用empty 填充其余语句?
      • 嗯好的,谢谢你的回答。我会努力解决这个问题。
      猜你喜欢
      • 2013-03-18
      • 2021-01-28
      • 1970-01-01
      • 2014-07-27
      • 2022-11-29
      • 2015-03-27
      • 1970-01-01
      • 2020-05-05
      • 2016-09-25
      相关资源
      最近更新 更多