簡體   English   中英

向方法發送未指定數量的參數

[英]Send an Unspecified Number of Parameters to a Method

我有一個程序,目前是硬編碼的,用於發送用戶輸入到 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 個params以及預定義的參數,例如IDWhatfileQueryType

有沒有一種方法可以讓 SendToDBF 采用未指定數量的參數,並用空格填充用戶未輸入的其余參數?

如果類型始終是string ,則可以在 C# 中使用params關鍵字

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

我不知道您的問題的確切背景,但您可以:

  1. 將您的參數列表轉換為帶有鍵/值的字典(字典或字典),以便您可以將確切的參數傳遞給您的方法,這樣您就不會混淆每個參數的順序。

所以你會有一個

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

對於其余的參數,有一個帶有鍵的數組,您可以在其中比較並用空白填充其余部分(我猜您的程序需要所有參數)

或另一種選擇:使用包含所有參數的默認字典,每列具有默認值:

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

然后您只需將默認值與參數合並,然后將所有鍵和值添加到命令中。

請參閱: 在 C# 中合並字典

  1. 如果順序對參數不重要(我懷疑),您可以使用 params 關鍵字。 請參閱為什么使用 params 關鍵字? 什么時候使用。

您可以使用params

public bool SendToDBF(params  string[] parameters)
{

}

public bool SendToDBF(params  object[] parameters)
{

}

我會構建一個字段名稱和值的字典,並自己構建 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 語句的其余部分分開,因為您需要兩次遍歷集合,這似乎沒有必要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM