Avatar billede ircnoob Nybegynder
10. august 2006 - 15:01 Der er 19 kommentarer og
1 løsning

Prepared statement konvertering til SqlDataAdapter

Hej,
i java brugte jeg prepared statement, men så vidt jeg kan læse mig frem til gør man i c# brug af SqlDataAdapter ?
Men nogen der kan hjælpe lidt med hvordan det lige skal bruges..

Old code..

PreparedStatement st = con.prepareStatement("INSERT INTO member VALUES (LAST_INSERT_ID(),?,?,?,?,?,?,?,?,?,?,?,?)");
        st.setString(1, m.getName());
        st.setString(2, m.getAdress()); blablabla



Den jeg skal have konverteret ..
Avatar billede mikkel_sommer Nybegynder
10. august 2006 - 15:41 #1
Hvis du bare skal lave en simpel insert kan du gøre således:

OleDbConnection aConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=sti til din database;");
string insert = din insert sætning;
           
OleDbCommand aCommand = new OleDbCommand(insert, aConnection);
aConnection.Open();
int i = aCommand.ExecuteNonQuery();
aConnection.Close();
Avatar billede ircnoob Nybegynder
10. august 2006 - 16:11 #2
Vedlagte jo netop kode for at du kunne se eksemplet .. ? Har ikke så jeg kan sige at jeg skal indsætte en bestemt værdi, er værdien fra tekstfelter med informationer om fornavn, efternavn, adresse osv..
Avatar billede arne_v Ekspert
10. august 2006 - 16:12 #3
Java PreparedStatement = .NET parameters
Avatar billede arne_v Ekspert
10. august 2006 - 16:15 #4
et eksempel som jeg har brugt i mine artikler om emnet:

Java/Oracle:

        Class.forName("oracle.jdbc.OracleDriver");
        Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:arnepc3", "arne", "xxxx");
        PreparedStatement pstmt = con.prepareStatement("INSERT INTO tt VALUES (?, ?)");
        pstmt.setInt(1, 123);
        pstmt.setString(2, "Hansen");
        pstmt.executeUpdate();
        pstmt.setInt(1, 124);
        pstmt.setString(2, "O'Toole");
        pstmt.executeUpdate();
        pstmt.close();
        con.close();

C#/SQLServer:

            SqlConnection con = new SqlConnection("Server=ARNEPC3;Integrated Security=SSPI;Database=Test");
            con.Open();
            SqlCommand cmd = new SqlCommand("INSERT INTO tt VALUES (@id, @name)", con);
            cmd.Parameters.Add("@id", SqlDbType.Int);
            cmd.Parameters.Add("@name", SqlDbType.VarChar, 50);
            cmd.Parameters["@id"].Value = 123;
            cmd.Parameters["@name"].Value = "Hansen";
            cmd.ExecuteNonQuery();
            cmd.Parameters["@id"].Value = 124;
            cmd.Parameters["@name"].Value = "O'Toole";
            cmd.ExecuteNonQuery();
            con.Close();
Avatar billede arne_v Ekspert
10. august 2006 - 16:17 #5
saa du laver din XxxxCommand med placeholders

(vigtigt: SqlCommand bruger @navn men MySqlCommand bruger ?navn)

saa definerer du typen for placeholder

og til sidste giver du placeholderne en vaerdi inden du executer
Avatar billede arne_v Ekspert
10. august 2006 - 16:25 #6
og et C#/MySQL snippet:

    MySqlConnection con = new MySqlConnection(CONNSTR);
    con.Open();
    MySqlCommand cre = new MySqlCommand("CREATE TABLE od (id INTEGER PRIMARY KEY, pic MEDIUMBLOB)", con);
    cre.ExecuteNonQuery();
    MySqlCommand ins = new MySqlCommand("INSERT INTO od VALUES (?id, ?pic)", con);
    ins.Parameters.Add("?id", MySqlDbType.Int32);
    ins.Parameters.Add("?pic", MySqlDbType.Blob);
    for(int i = 0; i < NPIC; i++)
    {
        byte[] b = new byte[PICSIZ];
        for(int j = 0; j < b.Length; j++) b[j] = (byte)(i % 256);
        ins.Parameters["?id"].Value = i;
        ins.Parameters["?pic"].Value = b;
        ins.ExecuteNonQuery();
    }
    con.Close();
Avatar billede ircnoob Nybegynder
10. august 2006 - 16:32 #7
aha!
Kanon,
smider du et svar og et link til de artikler du refererer til :) ?
Avatar billede arne_v Ekspert
10. august 2006 - 17:10 #8
Avatar billede arne_v Ekspert
10. august 2006 - 17:10 #9
om igen
Avatar billede ircnoob Nybegynder
10. august 2006 - 18:51 #10
Hrumff det er ligefrem nødvendigt at fortælle typen .. Det giver da ikke meget mening, er jo defineret i databasen ..
Avatar billede ircnoob Nybegynder
10. august 2006 - 19:04 #11
ID must be defined siger den ?

          MySqlConnection con = new MySqlConnection("Database=test;Data Source=localhost;User Id=root;Password=test");
            con.Open();
            MySqlCommand cmd = new MySqlCommand("INSERT INTO member VALUES (?id, ?name, ?adress, ?zipcode, ?city, ?phonenumber, ?email, ?birthday, ?dtfnr, ?sex, ?training, ?paid, ?pincode)", con);
            cmd.ExecuteNonQuery();
            cmd.Parameters.Add("?id", MySqlDbType.Int32);
            cmd.Parameters.Add("?name", MySqlDbType.VarChar);
            cmd.Parameters.Add("?adress", MySqlDbType.VarChar);
            cmd.Parameters.Add("?zipcode", MySqlDbType.Int32);
            cmd.Parameters.Add("?city", MySqlDbType.VarChar);
            cmd.Parameters.Add("?phonenumber", MySqlDbType.VarChar);
            cmd.Parameters.Add("?email", MySqlDbType.VarChar);
            cmd.Parameters.Add("?birthday", MySqlDbType.Int32);
            cmd.Parameters.Add("?dtfnr", MySqlDbType.Int32);
            cmd.Parameters.Add("?sex", MySqlDbType.VarChar);
            cmd.Parameters.Add("?training", MySqlDbType.Int32);
            cmd.Parameters.Add("?paid", MySqlDbType.Int32);
            cmd.Parameters.Add("?pincode", MySqlDbType.Int32);


            cmd.Parameters["?id"].Value = 7451;
            cmd.Parameters["?name"].Value = "Martin B";
            cmd.Parameters["?adress"].Value = "Solbakken";
            cmd.Parameters["?zipcode"].Value = 9999;
            cmd.Parameters["?city"].Value = "Vesterheden";
            cmd.Parameters["?phonenumber"].Value = "51859687";
            cmd.Parameters["?email"].Value = "no@way.no";
            cmd.Parameters["?birthday"].Value = 040476;
            cmd.Parameters["?dtfnr"].Value = 5896;
            cmd.Parameters["?sex"].Value = "m";
            cmd.Parameters["?training"].Value = 2;
            cmd.Parameters["?paid"].Value = 0;
            cmd.Parameters["?pincode"].Value = 1234;
Avatar billede arne_v Ekspert
10. august 2006 - 19:16 #12
compile time ? run time ? exact fejl tekst ?
Avatar billede arne_v Ekspert
10. august 2006 - 19:18 #13
der er et hav af overloads paa Add metoden og XxxxParameter constructor

og i nogle af dem heover man ikke angive typen

men som jeg husker det saa skal man altid enten angiven typen eller angive vaerdien

og da jeg normalt vil genbruge kommandoen med forskellige vaerdier, saa vaelger
jeg altid at angive typen

i Java angiver do jo ogsaa typen via valg af .setXxxx
Avatar billede ircnoob Nybegynder
10. august 2006 - 19:25 #14
Jamen ser det ikke rigtig nok ud hvad jeg har lavet ifl overstående.. ?

Fejlen sker når jeg opretter medlemmet .. altså ikke compile..
"Parameter '?id' must be defined"


************** Exception Text **************
MySql.Data.MySqlClient.MySqlException: Parameter '?id' must be defined
  at MySql.Data.MySqlClient.MySqlCommand.SerializeParameter(PacketWriter writer, String parmName)
  at MySql.Data.MySqlClient.MySqlCommand.PrepareSqlBuffers(String sql)
  at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
  at FDF.Form1.createMember() in C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\FDF\FDF\Form1.cs:line 171
  at FDF.Form1.buttonCreateMember_Click(Object sender, EventArgs e) in C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\FDF\FDF\Form1.cs:line 162
  at System.Windows.Forms.Control.OnClick(EventArgs e)
  at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
  at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
  at System.Windows.Forms.Control.WndProc(Message& m)
  at System.Windows.Forms.ButtonBase.WndProc(Message& m)
  at System.Windows.Forms.Button.WndProc(Message& m)
  at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
  at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Avatar billede ircnoob Nybegynder
10. august 2006 - 19:27 #15
Prøvede nemlig først uden at angive typen, men det forlanger den ved compile .. :)
Men har jeg ændret nu jo .. så håber du lige har en ide til hvad problemet kan være :)
Avatar billede arne_v Ekspert
10. august 2006 - 19:32 #16
oeh

kalder du ikke cmd.ExecuteNonQuery() inden du tilfoejer parameters ?
Avatar billede ircnoob Nybegynder
10. august 2006 - 20:15 #17
Kig et par postes op der postede jeg jo koden :)

MySqlCommand cmd = new MySqlCommand("INSERT INTO member VALUES (?id, ?name, ?adress, ?zipcode, ?city, ?phonenumber, ?email, ?birthday, ?dtfnr, ?sex, ?training, ?paid, ?pincode)", con);
--->>            cmd.ExecuteNonQuery();
            cmd.Parameters.Add("?id", MySqlDbType.Int32);

så jo gør jeg..
Avatar billede ircnoob Nybegynder
10. august 2006 - 20:26 #18
Bøh her er en der får samme fejl men blev ikk lige klogere..

http://forums.mysql.com/read.php?38,69853,69853#msg-69853
Avatar billede arne_v Ekspert
10. august 2006 - 20:26 #19
det skal du ikke

ned under alle parameter saetningerne

(i Java kalder du jo ogsaa executeUpdate efter setXxxxx'erne)
Avatar billede ircnoob Nybegynder
10. august 2006 - 20:51 #20
True
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester