在工作中遇到一些数据库访问的问题,这些问题大多数人都会用到,现将其整理如下:
1 一次插入多条记录
Oracle
使用SELECT … FROM DUAL虚表,例如:
INSERT INTO SCC.TEST (TEST1, TEST2, TEST3, TEST4)
SELECT 'AA', 1, 2.03, TO_DATE('2012-3-20 10:00:00', 'yyyy-MM-dd hh24:mi:ss') FROM DUAL
union all SELECT 'AA', 1, 2.03, TO_DATE('2012-3-20 10:2:34', 'yyyy-mm-dd hh24:mi:ss') FROM DUAL
Oracle除了这个方法,我没有找到其它的方法。
SqlServer
使用SELECT …,例如:
INSERT INTO [Table_1]
([test1]
,[test2]
,[test3]
,[test4])
SELECT 'AB', 1.0, 2.345, '2012-3-20 12:34:34'
union all SELECT 'AB', 1.0, 2.345, '2012-3-20 12:34:34'
union all SELECT 'AB', 1.0, 2.345, '2012-3-20 12:34:34'
也可以使用分号分隔多条sql语句,例:
INSERT INTO [Table_1]
([test1]
,[test2]
,[test3]
,[test4])
SELECT 'AB', 1.0, 2.345, '2012-3-20 12:34:34';
INSERT INTO [ctc].[dbo].[Table_1]
([test1]
,[test2]
,[test3]
,[test4])
SELECT 'AB', 1.0, 2.345, '2012-3-20 12:34:34'
2 日期的处理
Oracle 在处理日期类型的数据时必须使用to_date进行转换,sqlserver直接输入日期字符串就行,如上例所示。
3 ADO.NET访问接口,使用参数化命令,在.NET 2.0环境下测试
Oracle
cmd->CommandText = "INSERT INTO SCC.TEST (TEST1, TEST2, TEST3, TEST4) VALUES (:1, :2, :3, :4)";
cmd->Parameters->AddWithValue("1", "aa"); 字段是字符串
cmd->Parameters->AddWithValue("2", "10.34");//字段是NUMBER(10,0),没问题
cmd->Parameters->AddWithValue("2", 10.34);//字段是NUMBER(10,0),赋值浮点数没问题
cmd->Parameters->AddWithValue("2", "aaf"); //报错,无效的数据格式
cmd->Parameters->AddWithValue("3", 1.02); //字段是NUMBER(10,3),正确
cmd->Parameters->AddWithValue("3", “1.02”); //没问题
cmd->Parameters->AddWithValue("4", System::DateTime::Now); 字段是日期类型,正确
cmd->Parameters->AddWithValue("4", "2012-3-20 10:58:34"); //出错,日期类型格式错误
cmd->ExecuteNonQuery();
关于ADO.NET访问数据库的接口有两种方法,一个是每个数据库的专用接口例如:Oracle使用OraConnection,OraCommand,等;SqlServer使用SqlConnection,SqlCommand。这些接口的参数化方法Oracle和SqlServer使用上是不同的。
定义参数的时候Oracle使用“:变量名称”,在引用的时候可以加:也可以不加,
SqlServer使用 “@变量名称”,在引用的时候可以加@也可以不加@
另外在访问Oracle或SqlServer的时候也可以使用OleDbConnect,OleDbCommand
在访问Oracle数据库时,用法与上面的相同。
在访问SqlServer数据库时,参数处理与SqlCommand的处理方式不同,OleDbCommand参数定义的时候不能使用@而要使用?作为参数声明,在引用的时候不需要指定变量的名字,但要按变量定义的顺序来为参数赋值,不能搞错顺序。
在访问Access数据库的时候,由于微软没有提供专用的访问接口,只能使用OleDb的方式,参数化的使用方式同访问SqlServer的方法。
注:在参数类型赋值的时候三种方法都是相同的。