Autor Wątek: [c# sql server] Problem z parametrami  (Przeczytany 3517 razy)

Offline anakin_17

  • Użytkownik

# Maj 25, 2008, 20:51:38
siema, mam problem związany z c# i sql server 2005
widziałem podobne tematy poruszane na zagranicznych forach jednak nie dopatrzyłem sie nigdzie rozwiazania, które by mi pomogło( byc moze wynika to z mojej słabej znajomości ang ... niestety )
w bazie danych mam tabele która składa się z 5 pól wszystkie typu INT
chciałem teraz wczytać dane z kontrolki DataGridView i dopisać je do wspomnianej tabeli.
for (int i = 0; i < dataGridView1.Rows.Count; ++i)
            {
               
                SqlCommand cmd = new SqlCommand();

                SqlParameter p1 = cmd.CreateParameter();
                p1.SqlValue = SqlDbType.Int;
                p1.ParameterName = "@id";
                p1.Value = Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value );
               
                SqlParameter p2 = cmd.CreateParameter();
                p2.SqlValue = SqlDbType.Int;
                p2.ParameterName = "@id_produkt";
                p2.Value = Convert.ToInt32(dataGridView1.Rows[i].Cells[1].Value);
               
                SqlParameter p3 = cmd.CreateParameter();
                p3.SqlValue = SqlDbType.Int;
                p3.ParameterName = "@ilosc";
                p3.Value = Convert.ToInt32(dataGridView1.Rows[i].Cells[2].Value);
               
                SqlParameter p4 = cmd.CreateParameter();
                p4.SqlValue = SqlDbType.Int;
                p4.ParameterName = "@id_dokument";
                p4.Value = Convert.ToInt32(dataGridView1.Rows[i].Cells[3].Value);
               
                SqlParameter p5 = cmd.CreateParameter();
                p5.SqlValue = SqlDbType.Int;
                p5.ParameterName = "@cena";
                p5.Value = Convert.ToInt32( dataGridView1.Rows[i].Cells[4].Value );
               
                cmd.CommandText = "INSERT INTO zmiany VALUES(@id,@id_produkt,@ilosc,@id_dokument,@cena";
                cmd.Connection = conn;
                cmd.ExecuteNonQuery();
            }

conn to obiekt klasy SqlConnection wcześniej odpowiednio przygotowany do komunikacji z bazą.

Problem:
podczas działania programu po wykonaniu tych instrukcji wyskakuje wyjątek w funkcji ExecuteNonQuery()  o treści
"Must declare the scalar variable "@id".
Cytuj
System.Data.SqlClient.SqlException was unhandled
  Message="Must declare the scalar variable \"@id\"."
  Source=".Net SqlClient Data Provider"
  ErrorCode=-2146232060
  Class=15
  LineNumber=1
  Number=137
  Procedure=""
  Server="ARTUR-PC\\SQLEXPRESS"
  State=2
  StackTrace:
       w System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
       w System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
       w System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
       w System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
       w System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async)
       w System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
       w System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
       w Magazyn.Form1.button3_Click(Object sender, EventArgs e) w C:\Users\Artur\Documents\Visual Studio 2008\Projects\Magazyn\Magazyn\Form1.cs:wiersz 109
       w System.Windows.Forms.Control.OnClick(EventArgs e)
       w System.Windows.Forms.Button.OnClick(EventArgs e)
       w System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       w System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       w System.Windows.Forms.Control.WndProc(Message& m)
       w System.Windows.Forms.ButtonBase.WndProc(Message& m)
       w System.Windows.Forms.Button.WndProc(Message& m)
       w System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       w System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       w System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       w System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       w System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
       w System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       w System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       w System.Windows.Forms.Application.Run(Form mainForm)
       w Magazyn.Program.Main() w C:\Users\Artur\Documents\Visual Studio 2008\Projects\Magazyn\Magazyn\Program.cs:wiersz 18
       w System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       w System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       w Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       w System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       w System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       w System.Threading.ThreadHelper.ThreadStart()
  InnerException:
tutaj detale tego wyjątku

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xion

  • Moderator
    • xion.log

# Maj 25, 2008, 21:40:44
Nazwy parametrów podajemy bez znaku @ na początku, czyli:
p1.ParameterName = "id"; // itd.

Offline ura

  • Użytkownik

# Maj 25, 2008, 21:46:11
Imho powinieneś także dodać paramentry do połączenia poprzez  cmd.Parameters.Add .

Offline anakin_17

  • Użytkownik

# Maj 25, 2008, 22:22:23
pomogło to, co napisał Ura, dzięki wielkie...
zasugerowałem się tym, że tworzyłem parametr korzystając z metody obiektu cmd