2013-02-14 3 views
2

지난 몇 일간이 버그를 찾으려고했지만 성공하지 못했습니다.SQL 서버 데이터베이스에 문을 삽입하십시오.

데이터베이스에 새 행을 삽입하려고합니다. 모든 것이 잘됩니다. 오류가없고 프로그램이 중단되지 않습니다.

INSERT 문은 다음과 같습니다 : 내 데이터베이스에 쿼리를 실행할 때 새 행을 추가하기 때문에

INSERT INTO Polozaj(Znesek, Uporabnik, Cas, Kupec, Popust, Poln_znesek) 
VALUES(1,1,1,1,1,1) 

그 문이, 괜찮습니다.

내 C# 코드는 다음과 같습니다

이미 언급 한 바와 같이 프로그램이 쿼리를 실행하고 모든 것이 정상입니다,하지만 난 테이블 Racun에서 볼 때, 새로운이없는 것처럼
string connection = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=" + Application.StartupPath + "\\Trgovina.mdf;Integrated Security=True"; 
SqlConnection cn = new SqlConnection(connection); 

string payment = ((Button)sender).Text, maxID = string.Empty; 
double discount = Convert.ToDouble(discauntText.Text), totalPrice = Convert.ToDouble(fullPriceText.Text), fullPrice = Convert.ToDouble(discountPriceText.Text); 
switch (payment) 
{ 
    case "Dobavnica": discount = 10; break; 
    case "Kartica": discount = 0; break; 
    case "Gotovina": discount = 5; break; 
} 

cn.Open(); 

SqlCommand maxIdCmd = new SqlCommand("SELECT MAX(Id_racuna) FROM Racun", cn); 
maxID = Convert.ToString(maxIdCmd.ExecuteScalar()); 
maxID = maxID != "" ? Convert.ToString(Convert.ToInt32(maxID) + 1) : "1"; 

string stmt = "INSERT INTO Racun(Znesek, Uporabnik, Cas, Kupec, Popust, Poln_znesek) " + 
       "VALUES(@Price, @User, @Time, @Customer, @Discount, @FullPrice)"; 

SqlCommand cmd = new SqlCommand(stmt, cn); 
cmd.ExecuteNonQuery(); 

cn.Close(); 

, 그것은 본다 열. 다음과 같습니다 Racun가 쿼리를 만들 This database cannot be imported. It is either unsupported SQL Server version or an unsupported database compatibility.

그리고 내 테이블 :

CREATE TABLE [dbo].[Racun] (
    [Id_racuna] INT    IDENTITY (1, 1) NOT NULL, 
    [Znesek]  NUMERIC (10, 3) NULL, 
    [Uporabnik] NCHAR (20)  NULL, 
    [Cas]   NCHAR (15)  NULL, 
    [Kupec]  NCHAR (10)  NULL, 
    [Popust]  NUMERIC (10, 3) NULL, 
    [Poln_znesek] NUMERIC (10, 3) NULL, 
    PRIMARY KEY CLUSTERED ([Id_racuna] ASC) 
); 

모르겠어요 또한, 나는이 테이블 데이터 비주얼 스튜디오 (2012) 다시 시도 할 때 나에게처럼 보이는 오류를 제공 무슨 일이야. 누구든지 도와 줄 수 있습니까?

+0

어떤 버전의 SQL Server를 사용하고 있습니까? –

+0

@RyanGates가 자신의 연결 문자열을보고 있습니다 - MS SQL 2012 (v11) – t3hn00b

+0

여기서 매개 변수를 INSERT 명령에 추가합니까? cmd.Parameter.Add ("Price", SqlDbType.Int) .Value = 1;' – t3hn00b

답변

4

:

  1. 삽입에 성공했습니다.
  2. 예외가 발생합니다.
  3. 삽입을 다른 조치로 바꾸는 방아쇠가 있습니다.

방아쇠가 없으므로 테이블에 레코드가 없으므로 예외가 있어야합니다.

다른 레벨에서 예외를 포착하는 코드가 있습니까? 그것은 왜 당신이 그것을 보지 못하는지를 설명 할 것이고, 또한 데이터베이스 연결을 풀지 않은 상태로 남겨 두게 될 것입니다. 그러면 나중에 데이터베이스에 연결하는 데 문제가있는 이유가 설명 될 것입니다.

데이터베이스 연결에 using 블록을 사용하면 코드에 오류가 있어도 제대로 닫힙니다.

매개 변수화 된 쿼리를 사용하고 있지만 코드의 아무 곳이나 명령 개체에 매개 변수를 추가 한 것을 볼 수 없습니다. 그것은 다음과 같습니다 :

cmd.Parameters.Add("Price", SqlDbType.Decimal).Value = price; 
cmd.Parameters.Add("User", SqlDbType.NChar, 20).Value = user; 
cmd.Parameters.Add("Time", SqlDbType.NChar, 15).Value = time; 
cmd.Parameters.Add("Customer", SqlDbType.NChar, 10).Value = customer; 
cmd.Parameters.Add("Discount", SqlDbType.Decimal).Value = discount; 
cmd.Parameters.Add("FullPrice", SqlDbType.Decimal).Value = fullPrice; 
+0

그건 아무런 차이가 없습니다 .. 그 예외들에 대해 좀 더 설명해 주시겠습니까? – Clem

2

나는 try 블록에 코드를 포장하려고, 당신이 잡을 수 있는지 것 SqlExecption :

try { 
    SqlCommand cmd = new SqlCommand(stmt, cn); 
    cmd.ExecuteNonQuery(); 
} catch (SqlException ex) { 
    Console.WriteLine(ex.Message); 
} 

편집 : 당신이 당신의 INSERT 문에 대한 귀하의 매개 변수를 놓치고있는 것 같습니다하고, 당신은 아마 사용하여보고해야 SqlTransaction :

같은 삽입에 대한 세 가지 시나리오가있다
SqlCommand maxIdCmd = new SqlCommand("SELECT MAX(Id_racuna) FROM Racun", cn); 
maxID = Convert.ToString(maxIdCmd.ExecuteScalar()); 
maxID = maxID != "" ? Convert.ToString(Convert.ToInt32(maxID) + 1) : "1"; 

string stmt = "INSERT INTO Racun(Znesek, Uporabnik, Cas, Kupec, Popust, Poln_znesek) " + 
       "VALUES(@Price, @User, @Time, @Customer, @Discount, @FullPrice)"; 

SqlCommand cmd = new SqlCommand(stmt, cn); 

// Adding parameters to the insert statement: 
cmd.Parameters.AddWithValue("@Price", price); 
cmd.Parameters.AddWithValue("@User", user); 
cmd.Parameters.AddWithValue("@Time", time); 
cmd.Parameters.AddWithValue("@Customer", customer); 
cmd.Parameters.AddWithValue("@Discount", discount); 
cmd.Parameters.AddWithValue("@FullPrice", fullprice); 

// Start a transaction so we can roll back if there's an error: 
SqlTransaction transaction = cn.BeginTransaction(); 
cmd.Transaction = transaction; 

try { 
    cmd.ExecuteNonQuery(); 
    transaction.Commit(); 
} catch (SqlException ex) { 
    transaction.Rollback(); 
    Console.WriteLine(ex.Message); 
} finally { 
    cn.Close(); 
} 
+0

오류를 반환하지 않습니다. – Clem

+0

지금 : ExecuteNonQuery는 명령에 할당 된 연결이 보류중인 로컬 트랜잭션에있을 때 명령이 트랜잭션을 필요로합니다. 명령의 Transaction 속성이 초기화되지 않았습니다. – Clem

+0

@Klemzy 그 일은 유감스럽게 생각합니다. 트랜잭션 객체를 생성 한 직후에'cmd.Transaction = transaction;'줄을 추가하고 싶을 것이다. 여기에'SqlTransaction' 객체에 대한 자세한 내용이 있습니다 : http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.aspx –

관련 문제