2012-03-25 3 views
2

Итак, когда моя форма загружается, она будет подключаться к базе данных, а когда я нажму кнопку, она введет новую строку в мою базу данных, но после того, как я ее щелкнула, я didnt см. любые изменения в моей таблице.Невозможно вставить данные в базу данных C# sql

namespace database 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     SqlConnection con; 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      con = new SqlConnection(); 
      con.ConnectionString = 
       "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\myworkers.mdf;Integrated Security=True;User Instance=True"; 
      con.Open(); 
      MessageBox.Show("OPEN!"); 
     } 

     private void label1_Click(object sender, EventArgs e) 
     { 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      int x; 
      SqlCommand thiscommand = con.CreateCommand(); 
      thiscommand.CommandText = 
       "INSERT INTO player_info (player_id, player_name) values (10, 'Alex') "; 

      x = thiscommand.ExecuteNonQuery(); /* I used variable x to verify 
                that how many rows are 
                affect, and the return is 1. 
                The problem is that I don't 
                see any changes in my table*/ 
      MessageBox.Show(x.ToString()); 
      con.Close(); 
     } 
    } 
} 
+0

Что вы используете, чтобы проверить, вставлена ​​ли запись? Студия управления SQL Server? –

+0

Вы оставили имя пользователя и пароль для размещения вопроса, или они вообще не указаны в коде? – mowwwalker

+3

Почему вы открываете соединение в Form_Load? Открывайте, используйте и закрывайте (возможно, удаляйте) соединения там, где они вам нужны. –

ответ

9

Вы используете прикрепленный файл Db. Это означает, что Project-build создает копию в папке Bin, и вы имеете дело с двумя разными версиями Db. Вероятно, вы проверяете оригинал.

Это может быть очень полезно (свежая копия каждый раз). Если нет, измените свойство Copy-when файла Db.

+1

+1 Не знаю, если * это * актуальная проблема, но хорошая точка :) – Tigran

+0

Спасибо за ваше время. Итак, каков правильный или более эффективный способ сделать это? Потому что кажется, что я вставляю успешно, но я не просматриваю правильный файл db, Должен ли я загружать db онлайн ?? извините, я новичок в этом. –

+0

Вы можете просмотреть результаты в самой программе, ограничить копирование или (иногда) скопировать версию из папки bin \ debug в корневой каталог проекта. –

1

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

Coding Практика

Вы открываете соединение гораздо раньше, чем нужно (что означает, что вы держите ценный ресурс больше, чем это необходимо), и вы не очистить соединение или команду. Они реализуют IDisposable, поэтому вы должны вызвать Dispose() на них. Самый простой способ сделать это с помощью инструкции using.

Предложенное переписан:

// Remove initialization of the SqlConnection in the form load event. 

private void button1_Click(object sender, EventArgs e) 
{ 
    using (SqlConnection con = new SqlConnection()) 
    { 
     con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\myworkers.mdf;Integrated Security=True;User Instance=True"; 
     con.Open(); 
     // Optional: MessageBox.Show("OPEN!"); 
     int x; 
     using (SqlCommand thiscommand = con.CreateCommand()) 
     { 
      thiscommand.CommandText = "INSERT INTO player_info (player_id, player_name) values (10, 'Alex') "; 

      x = thiscommand.ExecuteNonQuery();  /*I used variable x to verify that how many rows are affect, and the return is 1. The problem is that i dont see any changes in my table*/ 
      // Optional: MessageBox.Show(x.ToString()); 
     } 
    } 
} 
+0

Согласился на 'использование', но затем также получить ConnString из конфига. –

+0

'IDisposableS' должен (не должен) быть удаленным и закрывать соединение, что является избыточным с использованием-statement (dispose закроет его неявно). +1 в любом случае –

+0

@Tim: Согласился не на избыточное вызов con.Close() (обновленный ответ). Что вы подразумеваете под первой частью вашего комментария? –

0

ExecuteNonQuery Метод объясняется следующим образом на MSDN:

 
Executes a Transact-SQL statement against the connection and returns 
the number of rows affected.

Если вы получаете 1 в качестве возвращаемого значения, одна запись должна быть вставлена.

Забыл ли ты за стол? Новая запись не будет отображаться автоматически в вашем приложении.

+0

Отбросьте свое время. –

+0

Итак, как проверить, работает ли запрос, если новая запись не будет отображаться автоматически в моем приложении. Есть ли лучший способ сделать это? Как использовать онлайн-студию управления db или sql ??? жаль, что я совершенно новичок в этом –

+0

NVM, я узнаю, что использование mysql намного проще, чем sqlserver. проблема решена, спасибо за помощь от всех. –

0

Возможно, вы запустите SQL Profiler, чтобы узнать, что на самом деле отправляется в вашу базу данных. Вы можете захватить SQL, а затем попробовать выполнить этот код непосредственно против базы данных.

«player_id» подразумевает, что это первичный ключ, если это тот случай, когда вставка потерпит неудачу.

Я также рекомендую изменить подход, как и другие, к стилю использования, поскольку это позволит вам управлять своими ресурсами и не заставлять соединения «висели».

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