【JAVA与C#比较】SQL语句操作数据库

1.java中用sql语句操作数据库有三种方式:到数据库协议连接数据库,到本地API方式连接数据库,JDBC-ODBC方式连接数据库,这三种不同方式都有不同的URL字符串,驱动字符串前两者相同,是"oracle.jdbc.driver.OracleDriver",而后一种是"sun.jdbc.odbc.JdbcOdbcDriver",它们都要采用JDBC。C#中通常用ADO.NET,里面含OleDbconnection和SqlConnection。


2.java在进行数据库连接前要加载数据库驱动,C#中不需要代码写这步,会自动实现。
//sqlserver数据库就是"com.microsoft.sqlserver.jdbc.SQLServerDriver"字符串
//oracle数据库就是"oracle.jdbc.driver.OracleDriver"字符串
Class.forName("com.mysql.jdbc.Driver");
//sqlserver数据库就是"jdbc:sqlserver://127.0.0.1:1433;DatabaseName=db_database17"字符串
//oracle数据库就是"jdbc:oracle:thin:@localhost;1521:db_database17"字符串
String url = "jdbc:mysql://localhost:3306/db_database17"; 
String user = "root";              //sqlserver数据库默认用户名为sa
String password = "123456";
Connection conn = DriverManager.getConnection(url,user,password);
//或者"Data Source=.\\SQLExpress;database=Northwind;Trusted_Connection=true;"
string source = "server=(local);"+"integrated security=SSPI;"+"database=Northwind";
using(SqlConnection conn = new SqlConnection(source))
{
    conn.Open();
}
另外,C#为了让开发人员不用再去记连接字符串中的参数名称,可以用SqlConnectionStringBuilder对象的相关属性进行赋值,java里面没有此类对象。形如:
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = ".\\SQLExpress";

3.java中Statement对象的execute方法结合其getResultSet和getUpdateCount方法,几乎可以执行任何SQL语句。C#中ExecuteScalar可用于返回一个结果,如表的记录个数、当前时间/日期,返回类型object,可以将结果强制转换为合适类型。


4.java在执行方面executeUpdate用于插入、更新、删除或创建表,返回受影响的记录个数,而C#用ExecuteNonQuery实现。java中executeQuery用于读取,返回SqlDataReader类型。而C#中是ExecuteReader用于读取,返回ResultSet类型。这些不同在后面的实例代码中也可以看到。


5.java中sql命令是从数据库连接对象创建,C#是以数据库连接对象作为参数构造。参照上面代码有
Statement stmt = conn.creatStatement();
String sql = "insert into tb_user(name,password,sex,age)"values('张三','111','男','22')";
stmt.executeUpdate();
string sql = "insert into tb_user(name,password,sex,age)"values('张三','111','男','22')";
SqlCommand cmd = new SqlCommand(select,conn);
int ret = cmd.ExecuteNonQuery();

6.针对参数和值比较多的情况,java中用占位符?和PrepareStatement来处理,使用PreparedStatement比使用Statement效率高,还可防止SQL注入。C#用参数@申明占位符和Parameters处理。以上面的插入语句为例:
String sql = "insert into tb_user(name,password,sex,age)values(?,?,'男',?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,"张三");
ps.setString(2,"111");
ps.setInt(4,22);
ps.executeUpdate();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "insert into tb_user(name,password,sex,age)"values(@name,@password,@sex,@age)";
cmd.Parameters.Add("@name",SqlDbType.VarChar,10).Value = "张三";
cmd.Parameters.Add("@password",SqlDbType.VarChar,15).Value = "111";
cmd.Parameters.Add("@sex",SqlDbType.VarChar,6).Value = "男";
cmd.Parameters.Add("@age",SqlDbType.Int).Value = 22;
int count = cmd.ExecuteNonQuery();

7.在查询方面,执行方法和返回结果集用的对象不同,参照上面代码有
String name,pwd;
ResultSet rs = stmt.executeQuery();
while(rs.next()){
    name = rs.getString(1);            //以列号查询,列号从1开始
    pwd = rs.getString("password");    //以列名查询
}
string name,pwd;
SqlDataReader read = cmd.ExecuteReader();
while(read.Read())
{
    name = read[0];                    //以索引查询,索引从0开始
    pwd = read["password"];            //以列名查询
}

8.java中调用存储过程使用CallableStatement,调用的sql语句格式为{call 过程名(?,?,...)}。而C#中依然是SqlCommand,是指需要设置命令类型为存储过程。参照上面代码
try(
Connection conn = DriverManager.getConnection(url,user,password);
CallableStatement cstmt = conn.prepareCall("{call add_people(?,?,?)}")){
    cstmt.setInt(1,4);
    cstmt.setInt(2,22);
    //注册CallableStatement的第三个参数是int类型
    cstmt.registerOutParameter(3,Types.INTERGER);
    cstmt.execute();
    int result = cstmt.getInt(3);
}
SqlCommand cmd = new SqlCommand("add_people",conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@age",4);
cmd.Parameters.Add(new SqlParameter("@name",SqlDbType.NChar,10,"name"));
cmd.Parameters.Add(new SqlParameter("@score",SqlDbType.Int,0,ParameterDirection.Output,false,0,0,"score",DataRowVersion.Default,null));
cmd.UpdatedRowSource = UpdatedRowSource.OutputParameters;//指定数据通过输出参数从存储过程中返回。
cmd.Parameters["@name"].Value = "张三";
cmd.ExecuteNonQuery();
int result = (int)cmd.Parameters["@score"].Value;//读取执行后的输出参数

9.java中RowSet把底层数据读取到内存中进行离线操作,操作完成后再同步到底层数据源,而在C#中是DataSet。


10.java中事务用连接对象的setAutoCommit方法进行处理,而C#中用TransactionScope处理。java提交事务用commit方法,C#用Complete方法。不过它们在出现未处理的SQLException异常时,系统将自动回滚事务。
boolean falg = conn.getAutoCommit();
conn.setAutoCommit(false); //关闭自动提交,开启事务
    ...//执行多个sql语句
conn.commit();             //异常的话可以通过conn.rollback()方法回滚事务 
conn.setAutoCommit(falg);
using(TransactionScope scope = new TransactionScope())
{
    ...//执行多个sql语句
    scope.Complete();
}

猜你喜欢

转载自blog.csdn.net/u014650759/article/details/79491114