Отправлять значения в базу данных, не вставлять дубликаты - PullRequest
0 голосов
/ 04 июля 2018

Необходимо проверить, есть ли значение из TextBox уже в базе данных, и не нужно ли его снова сохранить в базе данных.

Это код TextBox:

 <tr>
        <td>
            <asp:Label ID="lblProductConstruction" runat="server" Text="Product Construction:" Font-Names="Open Sans"></asp:Label></td>
        <td>
            <asp:TextBox ID="txtProductConstruction" runat="server"  Font-Names="Merriweather" margin-Left="100px" ></asp:TextBox><br />
        </td>
    </tr>
    <tr>

Кнопка сохранения:

<input type="button" class="button" id="myButton" value="Save"/>

Ajax при нажатии кнопки:

 $(function () {

             $('#myButton').on('click', function () {

                 var lvl = $('#MainContent_txtProductConstruction').val()

                 $.ajax({
                     type: "POST",
                     url: "NewProductConstruction.aspx/GetCollection",

                     data: JSON.stringify({'lvl': lvl }),

                     contentType: "application/json; charset=utf-8",
                     dataType: "json",

                     success: function (response) {
                         alert("Saved successfully.");
                         console.log(response);
                         location.reload(true);

                     },
                     error: function (response) {
                         alert("Not Saved!");
                         console.log(response);
                         location.reload(true);
                     }

                 });

             });

         });

WebMethod, который принимает значение и отправляет этот параметр (@ObjekatName) в базу данных:

[WebMethod(EnableSession = true)]
        public static void GetCollection(string lvl)
        {

              string conn = ConfigurationManager.ConnectionStrings["Connection"].ConnectionString;
            using (SqlConnection connection = new SqlConnection(conn))

                try
                {
                    connection.Open();
                    SqlCommand cmdCount = new SqlCommand("getDuplicate", connection);
                    cmdCount.CommandType = CommandType.StoredProcedure;
                    cmdCount.Parameters.AddWithValue("@ObjekatName", lvl);
                    cmdCount.ExecuteNonQuery();
                    int count = (int)cmdCount.ExecuteScalar();

                    if (count > 0)
                    {
                        connection.Close();
                    }
                    else
                    {
                        SqlCommand cmdProc = new SqlCommand("InsertObjekat", connection);
                        cmdProc.CommandType = CommandType.StoredProcedure;
                        cmdProc.Parameters.AddWithValue("@ObjekatName", lvl);
                        cmdProc.ExecuteNonQuery();
                        //strMsg = "Saved successfully.";
                    }

                }
                catch
                {


                }
                finally
                {
                    connection.Close();

                }

            return;

Первая процедура - выбор, который пытается найти значение в базе данных. Если этот выбор находит что-то, то Count должен быть больше 0, и это должно закрывать соединение. И если select ничего не возвращает, тогда это новое значение должно быть вставлено в базу данных.

Я выполнил и протестировал эти хранимые процедуры, и они работают нормально. Проблема в C #, я думаю, что я сделал что-то не так, и это не работает правильно. Может кто-нибудь помочь мне с c # part? КСТАТИ: Ajax работает нормально и значения принимаются WebMethod правильно

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Вместо двух выполнений из C # вы можете проверить дубликаты и вставить значения в одну и ту же процедуру.

            CREATE OR REPLACE PROCEDURE getDuplicate (ObjekatName IN VARCHAR2)
            AS
               V_COUNT   NUMBER;
            BEGIN
               SELECT   COUNT (1)
                 INTO   V_COUNT
                 FROM   TABLENAME
                WHERE   CatName = ObjekatName;

               IF (V_COUNT = 0)
               THEN
                  **-- insert command**

               END IF;
            END;
0 голосов
/ 04 июля 2018

могут быть проблемы с этими строками кода

 cmdCount.ExecuteNonQuery();
  int count = (int)cmdCount.ExecuteScalar();

согласно этому это команда два раза один executenonquery и затем executescalar,

согласно вашему требованию должен быть только один звонок ExecuteScalar, поэтому закомментируйте ExecuteNonQuery

  //cmdCount.ExecuteNonQuery(); comment not needed 
  int count = (int)cmdCount.ExecuteScalar();
...