2013-02-14 2 views
2

Я пытаюсь найти эту ошибку в течение последних нескольких дней, но без каких-либо успехов.Вставить инструкцию в базу данных SQL Server

Я пытаюсь вставить одну новую строку в базу данных. Все идет хорошо: нет ошибки, и никакая программа не сработает.

Мой INSERT заявление выглядит следующим образом:

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

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

Мой C# код выглядит следующим образом:

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, нет нового ряд. Кроме того, когда я пытаюсь обновить данные этой таблицы Visual Studio (2012) дает мне ошибку, которая выглядит как: This database cannot be imported. It is either unsupported SQL Server version or an unsupported database compatibility.

И мой стол Racun создать запрос выглядит следующим образом:

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) 
); 

Я не знаю, что не так. Может ли кто-нибудь помочь?

+0

Какую версию сервера sql вы используете? –

+0

@ RyanGates смотрит на свою строку подключения - MS SQL 2012 (v11) – t3hn00b

+0

Где вы добавляете параметры в команду 'INSERT'? Что-то в строке 'cmd.Parameter.Add (« Цена », 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); 
} 

Edit: Похоже, вы упускаете свои параметры для 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 –

Смежные вопросы