2016-09-06 18 views
0

私はこのWebアプリケーションを使用して、チェックボックスリストと値と日付を入力するテキストボックスを使用してWebフォームにデータを入力します。入力された値は、ストアドプロシージャを使用してデータベースに更新されます。ストアドプロシージャとクエリステートメントを使用した場合の正しい結果の問題

ストアドプロシージャを使用する場合、Webアプリケーションは正常に動作しますが、代わりにUpdateステートメントを使用すると、データベースで選択されたアイテムの数をユーザーが入力した値でデータベースを更新します。

たとえば、チェックボックスリストにすべての項目がチェックされている項目がある場合、ストアドプロシージャでは、ユーザが12を入力するとデータベースの各値は12になりますが、update文を使用すると、 132、誰も私にそれをなぜ説明し、ストアドプロシージャと同じ結果を得る方法があれば説明できますか?

CREATE TABLE AccountTable 
(
    RowID int IDENTITY(1, 1), 
    AccountID varchar(2), 
    AccountName varchar(50), 
    SeqNum int, 
    SeqDate datetime 
) 

CREATE PROCEDURE [ACCOUNTTABLE_UPDATE] 
    (@SeqNum int, 
    @SeqDate datetime, 
    @Account_ID varchar(2) 
    ) 
AS 
    SET NOCOUNT ON 

    BEGIN 
     UPDATE AccountTable 
     SET SeqNum = SeqNum + @SeqNum, SeqDate = @SeqDate 
     WHERE AccountID = @AccountID 
    END 

C#コード:

DateTime dt = DateTime.Now; 
DateTime.TryParseExact(datepicker.Text, "mmddyyyy", provider, style out dt); 

int i = Int32.Parse(TextBox1.Text); 
//DropDownList Binded from database values in another method 

SqlConnection con = new SqlConnection(GetConnString()); 

SqlCommand cmd = new SqlCommand(); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.CommandText = "[dbo].[Table_Update]"; 

//Update Query cmd.CommandText = "Update Account Table SET SeqNum = SeqNum + @SeqNum, SeqDate = @SeqDate WHERE AccountID = @AccountID;"; 

cmd.Parameters.AddWithValue("@SeqNum", SqlDbType.Int).Value = i 
cmd.Parameters.AddWithValue("@SeqDate",SqlDbType.DateTime).Value = DateTime.Now; 
cmd.Parameters["@Account_ID", SqlDbType.VarChar).Value = CheckBoxList1.SelectedValue; 

foreach (ListItem item in CheckBoxList.Items) 
{ 
    if (item.Selected) 
    { 
     cmd.Parameters["@SeqNum"].Value = i; 
     cmd.Parameters["@SeqDate"].Value = DateTime.Now; 
     cmd.Parameters["@Account_ID"].Value = item.Value; 

      try 
      { 
      con.Open(); 
      cmd.ExecuteNonQuery(); 
      } 
      catch (SqlException ex) 
      { 
       Response.Write(ex.Message); 
       //Database Exceptions 
      } 
      finally 
      { 
       con.Close(); 
      } 
    } 
} 
+1

Updateクエリでは、すでにデータベースに値がある場合、選択した特定の「Account_ID」のテーブルセットに既に存在するものとユーザーが入力した数値を加算します。 – walangala

+0

パラメータを2回定義しています - それはなぜですか? 'i'がどこで操作されているのかわからないコードはありますか? – user1666620

+0

@ user1666620または、その点については 'DateTime.Now'。 – itsme86

答えて

0

方法について:

public void data2() 
    { 
     DateTime dt = DateTime.Now; 
     DateTime.TryParseExact(datepicker.Text, "mmddyyyy", provider, style out dt); 

     int i = Int32.Parse(TextBox1.Text); 
     int check = 0; 
     //DropDownList Binded from database values in another method 

     foreach (ListItem item in CheckBoxList.Items) 
     { 
      if (item.Selected) 
      { 

       check++; 
      } 
     } 
     using (SqlConnection conn = GetConnString()) 
     { 
      conn.Open(); 

      using (SqlCommand cmd = new SqlCommand()) 
      { 
       // cmd.CommandType = CommandType.StoredProcedure; 
       //cmd.CommandText = "[dbo].[Table_Update]"; 
       cmd.CommandText = "Update Account Table SET SeqNum = SeqNum + @SeqNum, SeqDate = @SeqDate WHERE AccountID = @AccountID"; 
       cmd.Parameters.AddWithValue("@SeqNum", check); 
       cmd.Parameters.AddWithValue("@SeqDate", DateTime.Now); 
       cmd.Parameters["@Account_ID", CheckBoxList1.SelectedValue); 
       cmd.ExecuteNonQuery(); 
      } 


      conn.Close(); 
     } 
    } 

か、それTextBox1.Textを保存したい番号が既にある...

public void data3() 
    { 
     DateTime dt = DateTime.Now; 
     DateTime.TryParseExact(datepicker.Text, "mmddyyyy", provider, style out dt); 

     int i = Int32.Parse(TextBox1.Text); 
        //DropDownList Binded from database values in another method 

     using (SqlConnection conn = GetConnString()) 
     { 
      conn.Open(); 

      using (SqlCommand cmd = new SqlCommand()) 
      { 
       // cmd.CommandType = CommandType.StoredProcedure; 
       //cmd.CommandText = "[dbo].[Table_Update]"; 
       cmd.CommandText = "Update Account Table SET SeqNum = SeqNum + @SeqNum, SeqDate = @SeqDate WHERE AccountID = @AccountID"; 
       cmd.Parameters.AddWithValue("@SeqNum", TextBox1.Text); 
       cmd.Parameters.AddWithValue("@SeqDate", DateTime.Now); 
       cmd.Parameters["@Account_ID", CheckBoxList1.SelectedValue); 
       cmd.ExecuteNonQuery(); 
      } 


      conn.Close(); 
     } 
    } 

注記どちらの場合でも、あなたのSQLには "SeqNum = SeqNum + @SeqNum"が含まれているので、ここで選択したものを前に選択したものに加えて、何枚の写真を積み重ねて保存します。これをしたくない場合は、SQLを "SeqNum = @seqNum"に変更し、このページのロード中にのみ選択された番号に変更します。

+0

ありがとうShannon、ストアドプロシージャは正常に動作しますが、ストアドプロシージャの同じステートメントであるUpdate Queryを使用すると、間違っています結果。 – walangala

+0

これが機能しても、エラーの内容や提供したコードがどのように優れているか説明していないため、悪い回答です。 – user1666620

+0

私は上記の私のコメントでそれを説明しました。 "ループからあなたのconnを移動し、ループの中にあなたのcomを移動するので、同じcomに何度も何度も追加することなく、新しいものを作成します。 –

関連する問題