Avatar billede baitianlong Nybegynder
03. oktober 2007 - 12:33 Der er 17 kommentarer og
3 løsninger

simple mssql kald fra c# (oversaettelse fra java/mysel)

Jeg er vant til java og mysql, men er nu tvunget til at lave noget i c# med mssql. Det er dog lykkedes mig at aabne databasen. Kan en eller anden "oversaette" disse simple eksempler til c# / MSSQL :)

Her er min aabne database metode:

public static SqlConnection GetConnection()
        {
            SqlConnection con = new SqlConnection("user id=xxxxxx;" +
                                                          "password=xxxxxx;server=mssql3.wannafind.dk;" +
                                                          "Trusted_Connection=no;" +
                                                          "database=xxxxxx; " +
                                                          "connection timeout=30");
            try
            {
                con.Open();
            }
            catch(Exception e)
            {
                Console.Write(e.StackTrace);
            }
            return con;
        }

Og den virker som sagt fint.

Nu skal jeg bruge metoder som kan oprette en tabel og query en tabel, ligesom disse java / mysql eksempler:

--------------------- query ----------------------

public static List getCNANews() {
        List results = new ArrayList();
        Connection con = openDatabase();
        try{
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * FROM apacnews WHERE source='channelnewsasia' ORDER BY latestExtractionDate DESC LIMIT 5");
            while(rs.next()) {
                Apacnews a = new Apacnews();
                a.setSource(rs.getString("source"));
                a.setDate(rs.getTimestamp("date"));
                a.setHeadline(rs.getString("headline"));
                a.setContent(rs.getString("content"));
                a.setUrl(rs.getString("url"));
                results.add(a);
            }
        } catch (SQLException e) {
            e.printStackTrace();        }
        return results;
    }

-------------------- opret ---------------------

og saa een hvor man opretter en tabel a'la:

stmt.execute("CREATE TABLE eksempel(
                      id int(4) PRIMARY KEY auto_increment,
                      name varchar(255),
                      email varchar(255),
                      price decimal(10,2),
                      info text);

------------------ insert ---------------------

sql = "INSERT INTO stock(source, symbol, name, lasttrade)" +
                        " VALUES('" + source + "', '" + symbol + "', '" + name + "', '" + lasttrade + "')";

-----------------------------------------------

Det er som sagt det med statement, resultset og executeQuery jeg ikke ved hvordan man goer i c# og saa syntaxen af SQL til MSSQL

Paa forhaand tak.
Avatar billede medions Nybegynder
03. oktober 2007 - 12:53 #1
Her skal du bruge TOP 5 istedet for LIMIT 5:
Fx.

SELECT TOP 5 FROM ....

SELECT * FROM apacnews WHERE source='channelnewsasia' ORDER BY latestExtractionDate DESC LIMIT 5"

//>Rune
Avatar billede lasserasch Juniormester
03. oktober 2007 - 13:15 #2
Øhhhh, ved ikke lige hvad medions mener, men så vidt jeg har forstået dit spørgsmål, så er du interesseret i at få nogle eksempler på hvordan man kommunikerer med en SQL server, og udfører diverse ting (select, insert, update osv)...

Her nogle eksempler :



Metode til at udføre ting som f.eks.: Insert og Update. Altså hvor intet skal retuneres.
------------
public void Sqlnonquery ( String Sqltext )
{
SqlCommand cmd = new SqlCommand(Sqltext, GetConnection());
cmd.ExecuteNonQuery();
}
------------



SqlDataReader bruger man til at hente data ud og løbe igennem recordsæt efterfølgende.
-----------------
public SqlDataReader Sqlquery ( String sqltext )
{
SqlDataReader RSDR;
SqlCommand cmd = new SqlCommand(sqltext, GetConnection());
RSDR = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
return RSDR;
}


Din Sqlconnection har du lavet statisk. Hvorfor det? Det er der vel ikke nogen grund til!


F.eks. ville jeg vha. disse 2 eksempler jeg har givet kunne udføre en sql forespørgelse således :

-------
SqlDataReader SQDR = Sqlquery("select * from users")
While (SQDR.Read()) {Console.WriteLine(SQDR["brugersnavn"].Tostring());}
SQDR.Close();


/Lasse
Avatar billede lasserasch Juniormester
03. oktober 2007 - 13:18 #3
Og for at indsætte noget ville jeg kunne skrive :

Sqlnonquery("Insert into Users (brugernavn, password) values ('Bruger1', 'Password1')");

/Lasse
Avatar billede lasserasch Juniormester
03. oktober 2007 - 13:24 #4
Og husk også at mine 2 eksempler antager at du i toppen af din klasse har skrevet :

using System.Data.SqlClient;

/Lasse
Avatar billede baitianlong Nybegynder
03. oktober 2007 - 14:19 #5
jeg kommunikerer fint med databasen nu, tak Lasse, men der er lidt med syntaxen igen

Incorrect syntax near 'auto_increment'.

Her er metoden:

public static string SetupUserTable()
        {
            string result = "";
            SqlConnection connection = DatabaseAction.GetConnection();
            string sql = "CREATE TABLE users(id int(4) PRIMARY KEY auto_increment, " +
                                  "navn varchar(100), " +
                                  "adresse varchar(200), " +
                                  "postnummer int(6), " +
                                  "by varchar(100), " +
                                  "land varchar(100), " +
                                  "email varchar(100), " +
                                  "adgangskode varchar(50), " +
                                  "status int(1), " +
                                  "reklamer int(1), " +
                                  "telefonnummer varchar(15), " +
                                  "mobilnummer varchar(15), ";
            try
            {
                SqlCommand cmd = new SqlCommand(sql, connection);
                result = cmd.ExecuteNonQuery().ToString();
            }
            catch(SqlException e)
            {
                result = e.Message;
            }
            return result;                                           
        }

Grunden til at jeg hele tiden laver metoderne statiske er at saa kan jeg hurtigt i en scriptlet skrive f.eks DatabaseAction.InsertBruger(blah blah) uden at skulle instantiere osv. Jeg ved godt scriptlets er fy-fy, men hvad fa'n ha ha.

Hvis du lige hjaelper mig med auto_increment tror jeg points'ne er tjent :) Det er jo naesten som i java...
Avatar billede pidgeot Nybegynder
03. oktober 2007 - 14:23 #6
MSSQL kalder auto_increment for Identity.

CREATE TABLE users(id int(4) IDENTITY (1,1) PRIMARY KEY, (...)
Avatar billede lasserasch Juniormester
03. oktober 2007 - 16:13 #7
Ja, korrekt ang. auto_increment.

ang. det med en statisk SQL connection, så synes jeg det er en dårlig ide og bestemt FyFy, som du siger.

Hvorfor laver du ikke din connection som en metode. Om du skal skrive "connection" som er en statisk Sqlconnection eller om du skal skrive "connection()" som er en metode der retunerer en Sqlconnection er vel lige meget.

Det er bestemt mere rigtig at gøre det sådan.

Du kan jo heller ikke bruge samme connection 2 steder på en gang. Så hvis den er i brug af en SqlDataReader kan du jo ikke anvende den til en anden SqlDataReader samtidig. Så skal du oprette en ny statisk connection til det. Det er ret usmart i mange sammenhænge.

Men men.... Glad for at du fik det til at virke!

/Lasse
Avatar billede baitianlong Nybegynder
05. oktober 2007 - 12:51 #8
Jeg skal nok aflevere pointsne, men kan du/i lige afslutningsvis hjaelpe mig med denne metode, som skulle vise tabellerne i databasen

public static ArrayList ShowTables()
        {
            ArrayList result = new ArrayList();
            SqlConnection connection = DatabaseAction.GetConnection();
            string sql = "select * from information_schema.tables;";
            SqlCommand cmd = new SqlCommand(sql, connection);
            SqlDataReader RS;
            RS = cmd.ExecuteReader();
            while(RS.Read())
            {
                result.Add(RS[0].ToString());
            }
            return result;
        }

Den viser i stedet databasens navn 2 gange.
Avatar billede pidgeot Nybegynder
05. oktober 2007 - 13:41 #9
Tabelnavnet er nok ikke den første kolonne, skal du se ;)

Prøv RS[2] i stedet (der ville det ligge hvis det var MySQL) eller lige deromkring - eller lav queryen i Management Studio el. lign. og se hvilken kolonne det rent faktisk er.
Avatar billede lasserasch Juniormester
05. oktober 2007 - 15:34 #10
Jeg ville nok indsætte et BreakPoint ud for linjen : "result.Add(RS[0].ToString());"

Og så når breakpointet nåes, få vist indholdet af RS ved at holde musen hen over RS og så vælge at se indholdet af RS fra den menu der dukker op.

/Lasse
Avatar billede arne_v Ekspert
05. oktober 2007 - 15:41 #11
Avatar billede baitianlong Nybegynder
06. oktober 2007 - 11:21 #12
RS[2] gav mig tabellernes navne :) Men det bliver rart at faa en front-end, hvad jeg formoder management studio er...

Baade Lasserasch og pidgeot har vaeret behjaelpelige her, saa hvis pidgeot lige smider et svar, fordeler jeg points'ne.
Avatar billede pidgeot Nybegynder
06. oktober 2007 - 13:07 #13
Du kan hente Management Studio Express ganske gratis fra Microsoft: http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=C243A5AE-4BD1-4E3D-94B8-5A0F62BF7796

Og her har du så et svar :)
Avatar billede arne_v Ekspert
09. oktober 2007 - 04:19 #14
For de interesserede vil jeg lige smide 2 x Java + 4 x C# kode.
Avatar billede arne_v Ekspert
09. oktober 2007 - 04:19 #15
package october;

import java.sql.*;

public class MySql3 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost/Test", "", "");
        Statement cre = con.createStatement();
        cre.executeUpdate("CREATE TABLE j(id INTEGER NOT NULL, txt VARCHAR(50), PRIMARY KEY(id))");
        Statement ins = con.createStatement();
        for(int i = 0; i < 5; i++) {
            ins.executeUpdate("INSERT INTO j VALUES(" + (i+1) + ",'Test #" + (i+1) + "')");
        }
        Statement sel = con.createStatement();
        ResultSet rs = sel.executeQuery("SELECT id,txt FROM j WHERE id > 3");
        while(rs.next()) {
            int id = rs.getInt(1);
            String txt = rs.getString(2);
            System.out.println(id + " : " + txt);
        }
        rs.close();
        Statement drp = con.createStatement();
        drp.executeUpdate("DROP TABLE j");
        con.close();
    }
}
Avatar billede arne_v Ekspert
09. oktober 2007 - 04:19 #16
package october;

import java.sql.*;

public class MySql4 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost/Test", "", "");
        Statement cre = con.createStatement();
        cre.executeUpdate("CREATE TABLE j(id INTEGER NOT NULL, txt VARCHAR(50), PRIMARY KEY(id))");
        PreparedStatement ins = con.prepareStatement("INSERT INTO j VALUES(?,?)");
        for(int i = 0; i < 5; i++) {
            ins.setInt(1, i+1);
            ins.setString(2, "Test #" + (i+1));
            ins.executeUpdate();
        }
        PreparedStatement sel = con.prepareStatement("SELECT id,txt FROM j WHERE id > ?");
        sel.setInt(1, 3);
        ResultSet rs = sel.executeQuery();
        while(rs.next()) {
            int id = rs.getInt(1);
            String txt = rs.getString(2);
            System.out.println(id + " : " + txt);
        }
        rs.close();
        Statement drp = con.createStatement();
        drp.executeUpdate("DROP TABLE j");
        con.close();
    }
}
Avatar billede arne_v Ekspert
09. oktober 2007 - 04:20 #17
using System;
using System.Data.SqlClient;

namespace E
{
    public class SqlServer1
    {
        public static void Main(string[] args)
        {
            SqlConnection con = new SqlConnection("server=ARNEPC3\\SQLEXPRESS;Integrated Security=SSPI;database=Test");
            con.Open();
            SqlCommand cre = new SqlCommand("CREATE TABLE j(id INTEGER NOT NULL, txt VARCHAR(50), PRIMARY KEY(id))", con);
            cre.ExecuteNonQuery();
            SqlCommand ins = new SqlCommand();
            ins.Connection = con;
            for(int i = 0; i < 5; i++)
            {
                ins.CommandText = "INSERT INTO j VALUES(" + (i+1) + ",'Test #" + (i+1) + "')";
                ins.ExecuteNonQuery();
            }
            SqlCommand sel = new SqlCommand("SELECT id,txt FROM j WHERE id > 3", con);
            SqlDataReader rdr = sel.ExecuteReader();
            while(rdr.Read())
            {
                int id = rdr.GetInt32(0);
                String txt = rdr.GetString(1);
                Console.WriteLine(id + " : " + txt);
            }
            rdr.Close();
            SqlCommand drp = new SqlCommand("DROP TABLE j", con);
            drp.ExecuteNonQuery();
            con.Close();
            Console.ReadKey();
        }
    }
}
Avatar billede arne_v Ekspert
09. oktober 2007 - 04:20 #18
using System;
using System.Data;
using System.Data.SqlClient;

namespace E
{
    public class SqlServer2
    {
        public static void Main(string[] args)
        {
            SqlConnection con = new SqlConnection("server=ARNEPC3\\SQLEXPRESS;Integrated Security=SSPI;database=Test");
            con.Open();
            SqlCommand cre = new SqlCommand("CREATE TABLE j(id INTEGER NOT NULL, txt VARCHAR(50), PRIMARY KEY(id))", con);
            cre.ExecuteNonQuery();
            SqlCommand ins = new SqlCommand("INSERT INTO j VALUES(@id, @txt)", con);
            ins.Parameters.Add("@id", SqlDbType.Int);
            ins.Parameters.Add("@txt", SqlDbType.VarChar, 50);
            for(int i = 0; i < 5; i++)
            {
                ins.Parameters["@id"].Value = i+1;
                ins.Parameters["@txt"].Value = "Test #" + (i+1);
                ins.ExecuteNonQuery();
            }
            SqlCommand sel = new SqlCommand("SELECT id,txt FROM j WHERE id > @lim", con);
            sel.Parameters.Add("@lim", SqlDbType.Int);
              sel.Parameters["@lim"].Value = 3;
            SqlDataReader rdr = sel.ExecuteReader();
            while(rdr.Read())
            {
                int id = rdr.GetInt32(0);
                String txt = rdr.GetString(1);
                Console.WriteLine(id + " : " + txt);
            }
            rdr.Close();
            SqlCommand drp = new SqlCommand("DROP TABLE j", con);
            drp.ExecuteNonQuery();
            con.Close();
            Console.ReadKey();
        }
    }
}
Avatar billede arne_v Ekspert
09. oktober 2007 - 04:21 #19
using System;
using System.Data;
using System.Data.Common;

namespace E
{
    public class SqlServer3
    {
        public static void Main(string[] args)
        {
            DbProviderFactory dbf = DbProviderFactories.GetFactory("System.Data.SqlClient");
            IDbConnection con = dbf.CreateConnection();
            con.ConnectionString = "server=ARNEPC3\\SQLEXPRESS;Integrated Security=SSPI;database=Test";
            con.Open();
            IDbCommand cre = con.CreateCommand();
            cre.CommandText = "CREATE TABLE j(id INTEGER NOT NULL, txt VARCHAR(50), PRIMARY KEY(id))";
            cre.Connection = con;
            cre.ExecuteNonQuery();
            IDbCommand ins = con.CreateCommand();
            ins.Connection = con;
            for(int i = 0; i < 5; i++)
            {
                ins.CommandText = "INSERT INTO j VALUES(" + (i+1) + ",'Test #" + (i+1) + "')";
                ins.ExecuteNonQuery();
            }
            IDbCommand sel = con.CreateCommand();
            sel.CommandText = "SELECT id,txt FROM j WHERE id > 3";
            sel.Connection = con;
            IDataReader rdr = sel.ExecuteReader();
            while(rdr.Read())
            {
                int id = rdr.GetInt32(0);
                String txt = rdr.GetString(1);
                Console.WriteLine(id + " : " + txt);
            }
            rdr.Close();
            IDbCommand drp = con.CreateCommand();
            drp.CommandText = "DROP TABLE j";
            drp.Connection = con;
            drp.ExecuteNonQuery();
            con.Close();
            Console.ReadKey();
        }
    }
}
Avatar billede arne_v Ekspert
09. oktober 2007 - 04:21 #20
using System;
using System.Data;
using System.Data.Common;

namespace E
{
    public class SqlServer4
    {
        public static void Main(string[] args)
        {
            DbProviderFactory dbf = DbProviderFactories.GetFactory("System.Data.SqlClient");
            IDbConnection con = dbf.CreateConnection();
            con.ConnectionString = "server=ARNEPC3\\SQLEXPRESS;Integrated Security=SSPI;database=Test";
            con.Open();
            IDbCommand cre = con.CreateCommand();
            cre.CommandText = "CREATE TABLE j(id INTEGER NOT NULL, txt VARCHAR(50), PRIMARY KEY(id))";
            cre.Connection = con;
            cre.ExecuteNonQuery();
            IDbCommand ins = con.CreateCommand();
              ins.CommandText = "INSERT INTO j VALUES(@id,@txt)";
            ins.Connection = con;
            IDbDataParameter p1 = ins.CreateParameter();
            p1.ParameterName = "@id";
            p1.DbType = DbType.Int32;
            ins.Parameters.Add(p1);
            IDbDataParameter p2 = ins.CreateParameter();
            p2.ParameterName = "@txt";
            p2.DbType = DbType.String;
            p2.Size = 50;
            ins.Parameters.Add(p2);
            for(int i = 0; i < 5; i++)
            {
                ((IDbDataParameter)ins.Parameters["@id"]).Value = i+1;
                ((IDbDataParameter)ins.Parameters["@txt"]).Value = "Test #" + (i+1);
                ins.ExecuteNonQuery();
            }
            IDbCommand sel = con.CreateCommand();
            sel.CommandText = "SELECT id,txt FROM j WHERE id > @lim";
            sel.Connection = con;
            IDbDataParameter p = ins.CreateParameter();
            p.ParameterName = "@lim";
            p.DbType = DbType.Int32;
            p.Value = 3;
            sel.Parameters.Add(p);
            IDataReader rdr = sel.ExecuteReader();
            while(rdr.Read())
            {
                int id = rdr.GetInt32(0);
                String txt = rdr.GetString(1);
                Console.WriteLine(id + " : " + txt);
            }
            rdr.Close();
            IDbCommand drp = con.CreateCommand();
            drp.CommandText = "DROP TABLE j";
            drp.Connection = con;
            drp.ExecuteNonQuery();
            con.Close();
            Console.ReadKey();
        }
    }
}
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