2014-04-09 4 views
1

요청한 경우 prodName 데이터베이스에없는 레코드를 삽입하려고합니다. 존재하는 경우 quantity 값을 업데이트하려고합니다. 나는 다음 레코드를 삽입하거나 업데이트하지 않았다. 나는 예외 다음 얻을 :asp.net 및 SQL SERVER 2008 삽입/업데이트

ExecuteScalar requires an open and available Connection. The connection's current state is closed

이 코드 내가 내 코드를 편집 편집

public static void manageStock(CompanyStock stock) 
    { 
     ///// Check if record exists///////// 
     cmd = new SqlCommand("select count(*) from tblStock where [email protected]", con); 
     cmd.Parameters.AddWithValue("@prodName", stock.prodName); 
     con.Open(); 
     Int32 count = (Int32)cmd.ExecuteScalar(); //returns null if doesnt exist 
     con.Close(); 

     if (count > 0) 
     { 
      cmd = new SqlCommand("update tblStock set quantity = @quantity where [email protected]", con); 
      cmd.Parameters.AddWithValue("@prodName", stock.prodName); 
      cmd.Parameters.AddWithValue("@quantity", stock.quantity); 
     } 
     else 
     { 
      cmd = new SqlCommand("insert into tblStock(prodName,quantity) values (@prodName, @quantity)", con); 
      cmd.Parameters.AddWithValue("@prodName",stock.prodName); 
      cmd.Parameters.AddWithValue("@quantity",stock.quantity); 
     } 

     try 
     { 
      con.Open(); 
      cmd.ExecuteNonQuery(); 
     } 

     finally 
     { 
      con.Close(); 
     } 
    } 
} 

에게 있습니다. 지금은 잘 작동합니다. 실행하기 전에 연결을 열어야 만했습니다 ExecuteScalar하지만이 열기 및 닫기 작업을 작성하는 표준 방법을 알고 싶습니다. 우연이 아닌 것처럼 보입니다. 어떻게 개선 할 수 있습니까?

+0

을 사용할 수 있습니다 뒤에 코드에서 다음

CREATE PROCEDURE sprocquanupdateinsert @prodName nvarchar(250), @quantity int AS BEGIN UPDATE tblStock SET quantity = @quantity WHERE prodName = @prodName IF @@ROWCOUNT = 0 INSERT INTO tblStock(prodName, quantity) VALUES (@prodName, @quantity) END GO 

: 먼저 저장 프로 시저를 작성합니다. 귀하의 코드가 어떻게 실행되는지 모르겠습니다. 이것이 실제로 코드라면, 항상 tblStock 명령으로 INSERT를 실행합니다. – abhi

+0

코드의 문제점은 예외를 처리하지 않아서 실제로 문제가 무엇인지 알려주는 오류 메시지를 볼 수 없다는 것입니다. – Pleun

+1

@Pleun 'catch'가 없어도 버블을 일으키지 않을까요? 어딘가에 삼키는 스택에 뭔가가있는 것처럼 들리지만. –

답변

0

Convert.ToInt32() 메서드를 사용하여 결과를 정수 값으로 변환 할 수 있습니다.

값이 null이면 0으로 변환됩니다.

이 시도 :

int count = Convert.ToInt32(cmd.ExecuteScalar()); 
0

는 SQL 서버에 절을 병합 사용하는 것이 좋습니다. 여기에 좋은 Microsoft article을 사용할 수 있습니다.

0

코드를 단계별로 실행하면 어떻게됩니까?

일부 SQL 데이터 정렬 (예 : Latin1_General_BIN)에서 변수는 대/소문자를 구분합니다. 첫 번째 SELECT 문에서 쿼리에 @P rodName, 매개 변수 컬렉션에 @p rodName이 있습니다. 대소 문자를 구분하는 데이터 정렬을 사용하면이 부분을 지나칠 수 없습니다. Management Studio에서 데이터베이스를 마우스 오른쪽 단추로 클릭하고 속성을 클릭하여 데이터 정렬을 찾습니다.

+0

그래도 문제가 해결되었지만 여전히 작동하지 않습니다 – Insafian

+0

코드를 단계별로 실행하면 어떻게됩니까? – InbetweenWeekends

+0

편집 내용을 다시 읽은 후, SELECT 행에'con' 연결을 제공하고 있지만, 열어 보지 못했습니다. – InbetweenWeekends

0

오류 con.State = 열거 나 다른 값을 확인이 u는 모든 문제의 첫번째 그래서

확인 연결을 확인 어떤 connection.May 없습니다와 경우가 null는 아니고, 말과이 시점에서 존재한다. 나는 연결 상태가 열려 닫힙니다.하지만 우선 연결 선언은 어디에 있습니까? 나는 당신의 코드에서 그것을 볼 수 없습니다.

는이 시도 :

//USING THE STATEMNET USING IT WILL TAKE CARE TO DISPOSE CONNECTION AND PLACE TRY CATCH WITHIN PROCS 

{ 
using (SqlConnection cnn = new SqlConnection(ConfigurationManager.AppSettings("connectionString"))) { 
    if (cnn.State == System.Data.ConnectionState.Closed) 
     cnn.Open(); 
    using (SqlCommand cmd = new SqlCommand()) { 
     try { 
      cmd.Connection = cnn; 
      cmd.CommandText = "YOUR SQL STATEMENT"; 
      int I = Convert.ToInt32(cmd.ExecuteNonQuery); 

      if (I > 0) 
      { 
       cmd.CommandText = "YOUR SQL STATEMENT"; 
      //ADDITIONAL PARAMTERES 
      } 
      else 
      { 
       cmd.CommandText = "YOUR SQL STATEMENT"; 
       //ADDITIONAL PARAMETERS 
      } 
      cmd.ExecuteNonQuery(); 
      } 
       catch (Exception ex) 
      { 
      Response.Write(ex.Message); 
      } 
     } 
    } 
} 
+0

my qs. 그것을 확인하십시오 – Insafian

+0

내 솔루션을 좀 더 간단하고 safe.Never 열린 기억을 떠났다 :). 그것은 당신의 목표와 일치하는 답변으로 – makemoney2010

0

당신이 코드를 시도 할 수 있습니다. 당신은 내가 당신이 당신의 실행 첫 번째 명령 객체하기 전에 연결을 열 필요가 생각이

using (conn) 
{ 
    SqlCommand cmd = new SqlCommand("sprocquanupdateinsert", conn); 
    cmd.CommandType = CommandType.StoredProcedure; 

    cmd.Parameters.AddWithValue("@prodName", stock.prodName); 
    cmd.Parameters.AddWithValue("@quantity", stock.quantity); 

    conn.Open(); 
    cmd.ExecuteNonQuery(); 
    conn.Close(); 
}