Как избежать инициализации каждый раз, когда значение больше 0 - PullRequest
0 голосов
/ 13 марта 2019

У меня есть метод, который вставляет новую запись после проверки, существует ли она уже или нет.

Вот мой метод:

protected void btn_save_Click(object sender, EventArgs e)
{
    string MobileNo = "";
    string replaceValue = txt_mobile.Text.Replace(Environment.NewLine, "$");

    string[] values = replaceValue.Split('$');
    int uCnt = 0;
    int sCnt = 0;

    foreach (string item in values)
    {
        SaveRecord(item.Trim(),out MobileNo,out uCnt,out sCnt);
    }

    txt_mobile.Text = string.Empty;

    if(uCnt > 0)
    {
        ClientScript.RegisterStartupScript(this.GetType(), "BulkSMS System", "alert('Mobile No(s) : "+MobileNo.TrimEnd(',')+" Already Exist');", true);
    }

    if(sCnt > 0)
    {
        ClientScript.RegisterStartupScript(this.GetType(), "BulkSMS System", "alert('" + sCnt + " Record(s) Inserted Successfully');", true);
    }

    Get_Data();
}

public void SaveRecord(string value, out string MobileNo, out int uCnt, out int sCnt)
{
    uCnt = 0; //every time initialized to 0
    sCnt = 0; //every time initialized to 0 
    MobileNo = "";

    try
    {
        DataTable dt = new DataTable();
        var dot = Regex.Match(value, @"\+?[0-9]{10}");

        if (dot.Success)
        {
            string str = "SELECT TOP 1 [ID],[MobileNo] FROM[dbo].[whitelistdata]";
            str += " WHERE [UserID] = '" + Convert.ToInt32(ddl_users.SelectedValue.ToString()) + "' AND [SenderId] = '" + Convert.ToInt32(ddl_senders.SelectedValue.ToString()) + "' AND [MobileNo] = '" + value + "'";
            dt = obj.Get_Data_Table_From_Str(str);

            if (dt.Rows.Count > 0)
            {
                uCnt++;
                MobileNo += value + ",";
            }
            else
            {
                string str1 = "INSERT INTO [dbo].[whitelistdata]([UserID],[SenderId],[KeywordID],[MobileNo])";
                str1 += "VALUES (" + Convert.ToInt32(ddl_users.SelectedValue.ToString()) + "," + Convert.ToInt32(ddl_senders.SelectedValue.ToString()) + ",1," + value + ")";
                obj.Execute_Querry(str1);
                sCnt++;
            }
        }
    }
    catch (Exception ex)
    {
        CommonLogic.SendMailOnError(ex);
        ClientScript.RegisterStartupScript(this.GetType(), "BulkSMS System", "alert('" + ex.Message.ToString() + "');", true);
    }
}

Проблема заключается в том, что каждый раз, когда он установлен в 0, когда был вызван метод, я хочу предотвратить их, когда предыдущее значение больше 0.

Пожалуйста, помогите мне, ребята ..

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Вам нужно использовать ref вместо out, если вы хотите сохранить этот дизайн 1 . Это означает, что метод может предполагать, что переменные уже инициализированы, и вы не обязаны повторно инициализировать их в пределах метода:

public void SaveRecord(string value,out string MobileNo,ref int uCnt,ref int sCnt)
{
    //uCnt = 0; //initialized by caller
    //sCnt = 0; //initialized by caller
    MobileNo = ""; //?
   ....

А на сайте звонка:

SaveRecord(item.Trim(),out MobileNo,ref uCnt,ref sCnt);

Вы также захотите сделать что-то относительно MobileNo, если вы ожидаете, что накапливает значений, а не перезаписывается каждый раз в цикле. Возможно, сделайте вместо этого StringBuilder, который вы просто проходите нормально (без ref или out) и позволяете добавить метод SaveRecord. out определенно не подходит для этого.


1 Многие люди недовольны методом, который явно хочет, чтобы возвратил объявленные значения void и сделал все возвраты через ref / out.

Что-то вроде:

public bool SaveRecord(string value)
{
   ...

Возвращает true для новой записи, false для существующей записи. Я бы, вероятно, взял оттуда обработку исключения и позволил исключению распространиться выше, прежде чем оно будет обработано. Тогда сайт вызова будет:

if(SaveRecord(item.Trim()))
{
   sCnt++;
}
else
{
   uCnt++;
   MobileNo += item.Trim + ","
}
1 голос
/ 13 марта 2019

Пожалуйста, сначала укажите, какая база данных для регистрации комбинации.

, если комбинация UserID И SenderId совпадает затем* если комбинация UserID ИЛИ SenderId соответствует То

 string str = "SELECT TOP 1 [ID],[MobileNo] FROM[dbo].[whitelistdata]";
 str += " WHERE [UserID] = '" + Convert.ToInt32(ddl_users.SelectedValue.ToString()) + "' OR [SenderId] = '" + Convert.ToInt32(ddl_senders.SelectedValue.ToString()) + "'";

если комбинация ИД пользователя И SenderId И MobileNo соответствует ТО

string str = "SELECT TOP 1 [ID],[MobileNo] FROM[dbo].[whitelistdata]";
str += " WHERE [UserID] = '" + Convert.ToInt32(ddl_users.SelectedValue.ToString()) + "' AND [SenderId] = '" + Convert.ToInt32(ddl_senders.SelectedValue.ToString()) + "' AND [MobileNo] = '" + value + "'";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...