进行高级数据访问_第1页
进行高级数据访问_第2页
进行高级数据访问_第3页
进行高级数据访问_第4页
进行高级数据访问_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、使用 ADO.NET 和 Oracle 进行高级数据访问发布日期: 11/4/2004 | 更新日期: 11/4/2004Bill Hamilton适用范围:Microsoft ADO.NET 1.1Oracle 数据类型摘要:学习如何使用 ADO.NET 1.1 从复杂的 Oracle 数据类型中检索数据。 引言.NET Framework Data Provider for Oracle 并不总是能够方便地检索出以复杂方式存储的数据。本文将讨论如何访问存储在下表中列出的 Oracle 特定的数据类型中的数据:数据类型说明Any此数据类型用于明确定义可以存储任何类型的数据的数据类型。BFil

2、e指向包含非结构化二进制数据(存储在 Oracle 数据库之外)的操作系统文件的指针。Interval此数据类型用于指定时间间隔。LOB此数据类型用于存储非结构化二进制数据。RAW此数据类型用于存储不是由 Oracle 解释的二进制数据。REF CURSOR指向 SQL 游标的 PL/SQL 指针,用于返回数据库中的某一行。ROWID此数据类型用于表示数据库中某一行的特定地址。Timestamp此数据类型用于扩展 DATE 数据类型的功能。URI此数据类型用于存储引用某个文档或文档中某个特定部分的统一资源标识符 (URI)。User-defined根据基本 Oracle 数据类型和用户定义的数

3、据类型创建的复杂数据类型。XMLType此数据类型用于存储 XML 数据。命名空间包含用来访问使用 .NET Framework Data Provider for Oracle 的 Oracle 数据源的类型。除了 Oracle 特定的 DataReader、DataAdapter、Command 和 Connection 类外,该命名空间还包含一些类型,以支持 Oracle 数据类型并简化 Oracle 数据类型的使用。下表列出了这些类型:类型说明OracleBFile用于表示 Oracle BFILE 数据类型的类。OracleBinary用于表示可变长度的二进制数据流的结构。Oracl

4、eBoolean用于表示从 Oracle 数据类型之间的数据库比较返回的值的结构。OracleDateTime用于表示从公元前 4712 年 1 月 1 日到公元 4712 年 12 月 31 日之间的日期和时间值的结构。OracleLob用于表示存储在 Oracle 数据库中的大型二进制对象 (LOB) 的类。OracleMonthSpan用于存储以月表示的时间间隔并表示 Oracle INTERVAL YEAR TO MONTH 数据类型的结构。OracleNumber用于表示存储在 Oracle 数据库中、介于 -10-38 1 到 1038 1 之间的固定精度和范围的数字值的结构。Or

5、acleString用于表示存储在 Oracle 数据库中的可变长度字符流的结构。OracleTimeSpan用于存储时间间隔并表示 Oracle INTERVAL DAY TO SECOND 数据类型的结构。OracleTypeOracle 数据类型枚举对于每一种数据类型,以下代码示例显示了如何在表中创建该数据类型,如何用数据填充每个数据类型列,以及如何访问这些数据。返回页首AnyOracle 9i 引入了三种可供存储通用数据(即任何已知的数据类型或未命名的数据类型)的数据类型。这些数据类型为: SYS.ANYTYPE 包括对象和集合类型在内的任何 SQL 类型的数据类型说明。 SYS.AN

6、YDATA 包含给定类型的一个实例以及该类型的说明。ANYDATA 可以在不同的行中包含不同的数据类型。 SYS.ANYDATASET 包含一组数据及数据类型的说明。 以下代码将创建一个包含 ANYDATA 列的表格:OracleCommand cmd = conn.CreateCommand();cmd.CommandText = "CREATE TABLE MyAnyTable (Id NUMBER,AnydataCol SYS.ANYDATA)"cmd.ExecuteNonQuery();ANYDATA 包含一组静态函数,允许您通过明确转换参数并将参数作为 ANYDA

7、TA 数据类型值返回,以此来创建一个 ANYDATA 类型:ConvertNumber(num IN NUMBER)ConvertDate(dat IN DATE)ConvertChar(c IN CHAR)ConvertVarchar(c IN VARCHAR)ConvertVarchar2(c IN VARCHAR2)ConvertRaw(r IN RAW)ConvertBlob(b IN BLOB)ConvertClob(c IN CLOB)ConvertBfile(b IN BFILE)ConvertObject(obj IN "<object_type>&quo

8、t;)ConvertRef(rf IN "<object_type>")ConvertCollection(n IN "COLLECTION_1")以下代码将在表格中插入两行,即在第一行的 ANYDATA 列中插入 VARCHAR2,在第二行的 ANYDATA 列中插入 NUMBER:OracleConnection conn = new OracleConnection(CONNECTSTRING);conn.Open();OracleCommand cmd = conn.CreateCommand();cmd.CommandText =

9、"INSERT INTO MyAnyTable (Id, AnydataCol) VALUEScmd.ExecuteNonQuery();cmd.CommandText = "INSERT INTO MyAnyTable (Id, AnydataCol) VALUEScmd.ExecuteNonQuery();conn.Close();ANYTYPE 类型的 GETTYPENAME 函数返回与 ANYDATA 字段中实际存储的数据对应的 ANYTYPE。以下代码将使用 GETTYPENAME 在插入的两行中检索 ANYDATA 列中的数据类型:OracleConnectio

10、n conn = new OracleConnection(CONNECTSTRING);OracleCommand cmd = new OracleCommand(conn.Open();OracleDataReader dr = cmd.ExecuteReader();while(dr.Read()Console.WriteLine(dr.GetString(0); dr.Close();conn.Close();控制台输出为:SYS.VARCHAR2SYS.NUMBERANYDATA 包含一组成员函数,允许您将 ANYDATA 数据作为适当数据类型的值进行检索:GetNumber(sel

11、f IN AnyData, num OUT NOCOPY NUMBER)GetDate(self IN AnyData, dat OUT NOCOPY DATE) GetChar(self IN AnyData, c OUT NOCOPY CHAR) GetVarchar(self IN AnyData, c OUT NOCOPY VARCHAR) GetVarchar2(self IN AnyData, c OUT NOCOPY VARCHAR2) GetRaw(self IN AnyData, r OUT NOCOPY RAW)GetBlob(self IN AnyData, b OUT

12、NOCOPY BLOB) GetClob(self IN AnyData, c OUT NOCOPY CLOB) GetBfile(self IN AnyData, b OUT NOCOPY BFILE) GetObject(self IN AnyData, obj OUT NOCOPY "<object_type>") GetRef(self IN AnyData, rf OUT NOCOPY "<object_type>") GetCollection(self IN col AnyData, OUT NOCOPY "

13、;<collection_type>") 以下函数允许您查询 ANYDATA 列,并在 VARCHAR2 中返回每一行的结果:CREATE OR REPLACE FUNCTION GETANYDATA (data IN SYS.ANYDATA)return VARCHAR2asl_varchar2 varchar2(4000);l_rc number;begincase data.getTypeNamewhen 'SYS.NUMBER' thenl_rc := data.getNumber(l_varchar2);when 'SYS.VARCHAR

14、2' thenl_rc := data.getVarchar2(l_varchar2);elsel_varchar2 := 'ERROR:unknown data type'end case; return l_varchar2; end;可以对此函数进行扩展,以支持其他本机数据类型和用户定义的数据类型。以下代码将使用函数返回表格中两行的值。OracleConnection conn = new OracleConnection(CONNECTSTRING);OracleCommand cmd = new OracleCommand("SELECT id,FR

15、OM MyAnyTable e", conn);conn.Open();OracleDataReader dr = cmd.ExecuteReader();while(dr.Read()Console.WriteLine(dr.GetInt32(0) + " " + dr.GetString(1) + " " +dr.GetString(2);dr.Close();conn.Close();控制台输出为:1; SYS.VARCHAR2; TEST STRING2; SYS.NUMBER; 100您也可以在 ANYTYPE 字段中存储用户定义的数

16、据类型的实例。以下代码将创建用户定义的类型 EMPLOYEE_T:OracleCommand cmd = conn.CreateCommand();cmd.CommandText = "CREATE OR REPLACE TYPE Employee_t IS OBJECT(Name VARCHAR(50), YearsService INTEGER)"cmd.ExecuteNonQuery();可以使用以下代码将 EMPLOYEE_T 数据类型的值插入到表格中:cmd.CommandText = "INSERT INTO MyAnyTable (Id, Anyda

17、taCol) VALUEScmd.ExecuteNonQuery();GetTypeName 函数将以 <schemaname>.<UserTypeName> 的格式返回数据类型,例如 MySchema.EMPLOYEE_T。您可以使用访问用户定义的数据类型的方法(本文稍后会进行讨论)扩展存储过程,从而访问包含用户定义类型的 ANYTYPE 字段的内容。返回页首BFILEBFILE 数据类型是对存储在操作系统文件的数据库之外的二进制数据的引用。它的最大值为 4GB。存储在这些列中的数据是只读的。以下代码将创建一个包含 BFILE 数据类型列的表格:OracleComma

18、nd cmd = conn.CreateCommand();cmd.CommandText = "CREATE TABLE MyBfileTable (Id NUMBER, BfileCol BFILE)"cmd.ExecuteNonQuery();以下代码将创建一个 DIRECTORY 并将 SH_ANALZ.SQL 文件(随 Oracle 9i 一起安装)插入到 BFILE 数据类型中。运行此代码的帐户需要具有 CREATE ANY DIRECTORY 权限:int id = 1;OracleCommand cmd = conn.CreateCommand(); cmd

19、.CommandText = "CREATE OR REPLACE DIRECTORY MYBFILEDIR AS'C:oracleora92demoschemasales_history'"cmd.ExecuteNonQuery();cmd.CommandText = "INSERT INTO MyBfileTable VALUES(" + id + ", BFILENAME('MYBFILEDIR', 'SH_ANALZ.SQL')"cmd.ExecuteNonQuery();以下代

20、码将检索 BFILE 并将其内容保存到一个字符串中:int id = 1;byte bfile = null;OracleConnection conn = new OracleConnection(CONNECTSTRING);conn.Open();OracleCommand cmd = conn.CreateCommand();cmd.CommandText = "SELECT * FROM MyBfileTable WHERE id = " + id;OracleDataReader dr = cmd.ExecuteReader();if(dr.Read()Orac

21、leBFile bf = dr.GetOracleBFile(1);bfile = new bytebf.Length;bf.Read(bfile, 0, bfile.Length);bf.Close();dr.Close();conn.Close();UTF7Encoding utf = new UTF7Encoding();string s = utf.GetString(bfile);返回页首IntervalInterval 数据类型用于指定时间间隔。有两种 Interval 数据类型: INTERVAL DAY TO SECOND 此数据类型的固定大小为 11 个字节,它存储以天、小时

22、、分钟和秒表示的时间间隔。 INTERVAL YEAR TO MONTH 此数据类型的固定大小为 5 个字节,它存储以年和月表示的时间间隔。 以下代码将创建一个包含 INTERVAL DAY TO SECOND 和 INTERVAL YEAR TO MONTH 数据类型列的表格:OracleCommand cmd = conn.CreateCommand();cmd.CommandText = "CREATE TABLE MyIntervalTable (Id NUMBER,IntervalYTMCol INTERVAL YEAR TO MONTH,IntervalDTSCol IN

23、TERVAL DAY TO SECOND)"cmd.ExecuteNonQuery();以下代码将使用 OracleMonthSpan 和 OracleTimeSpan 结构插入一个包含时间间隔数据的行:OracleDataAdapter da = new OracleDataAdapter("SELECT Id, IntervalYTMCol, IntervalDTSCol FROM MyIntervalTable",CONNECTSTRING);DataTable dt = new DataTable();/ 获取架构da.FillSchema(dt, Sch

24、emaType.Source);OracleCommandBuilder cb = new OracleCommandBuilder(da);int id = 1;/ 1 年,2 个月OracleMonthSpan intervalYTMCol = new OracleMonthSpan(1, 2);/ 1 天,2 小时,3 分钟,4 秒,5 毫秒OracleTimeSpan intervalDTSCol = new OracleTimeSpan(1, 2, 3, 4, 5);/ 创建一个包含该数据的行DataRow row = dt.NewRow();row"Id" =

25、id;row"IntervalYTMCol" = intervalYTMCol.Value;row"IntervalDTSCol" = intervalDTSCol.Value;da.Update(dt);以下代码将使用 OracleDataReader 的 GetOracleMonthSpan() 和 GetOracleTimeSpan() 类型的访问器方法来检索时间间隔数据:int id = 1;OracleMonthSpan intervalYTMCol;OracleTimeSpan intervalDTSCol;OracleConnection

26、conn = new OracleConnection(CONNECTSTRING);OracleCommand cmd = new OracleCommand("SELECT IntervalYTMCol,IntervalDTSCol FROM MyIntervalTable WHERE Id = " + id, conn);conn.Open();OracleDataReader dr = cmd.ExecuteReader();if(dr.Read()intervalYTMCol = dr.GetOracleMonthSpan(0);intervalDTSCol =

27、dr.GetOracleTimeSpan(1);Console.WriteLine(intervalYTMCol.ToString() + " " +intervalDTSCol.ToString(); dr.Close();conn.Close();控制台输出为:14; 1.02:03:04.0050000返回页首LOBOracle LOB 数据类型可以存储高达 4GB 大小的非结构化数据(例如,多媒体内容和文本)。LOB 允许随机和分段访问数据。Oracle 建议在新应用程序中使用 LOB 类型,而不要使用 LONG RAW 类型。与 LONG RAW 不同的是,一个表

28、格中可以包含多个 LOB 列。LOB 数据类型包括: BLOB 存储二进制数据。 CLOB 存储单字节数据库字符集数据,以默认的服务器字符集为基础。 NCLOB 存储 Unicode 字符数据,以数据库的全局字符集为基础。 以下代码将创建一个包含 BLOB、CLOB 和 NCLOB 列的表格:OracleCommand cmd = conn.CreateCommand();cmd.CommandText = "CREATE TABLE MyBlobTable (Id NUMBER, BlobCol BLOB,ClobCol CLOB, NclobCol NCLOB)"cmd

29、.ExecuteNonQuery();以下代码将一个用户选定的文件插入到 BLOB 列中,并将一些测试文本插入到 CLOB 和 NCLOB 列中:OpenFileDialog ofd = new OpenFileDialog();if (ofd.ShowDialog() = DialogResult.OK)FileStream fs = new FileStream(ofd.FileName, FileMode.Open,FileAccess.Read);byte blob = new bytefs.Length;fs.Read(blob, 0, blob.Length);fs.Close()

30、;OracleDataAdapter da = new OracleDataAdapter("SELECT Id, BlobCol, ClobCol, NclobCol FROM MyBlobTable",CONNECTSTRING);DataTable dt = new DataTable();/ 获取架构da.FillSchema(dt, SchemaType.Source);OracleCommandBuilder cb = new OracleCommandBuilder(da);int id = 1;string clob = "test CLOB te

31、xt"string nclob = "test NCLOB text" / 创建一个包含该数据的行DataRow row = dt.NewRow();row"Id" = id;row"BlobCol" = blob;row"ClobCol" = clob;row"NclobCol" = nclob;/ 更新表格da.Update(dt);以下代码将检索 LOB 数据:int id = 1;OracleLob blob = null;String clob = ""S

32、tring nclob = ""OracleConnection conn = new OracleConnection(CONNECTSTRING);OracleCommand cmd = new OracleCommand("SELECT BlobCol, ClobCol, NclobCol FROM MyBlobTable WHERE Id = " + id,conn);conn.Open();OracleDataReader dr = cmd.ExecuteReader();if(dr.Read()if(!dr.IsDBNull(0)blob =

33、 dr.GetOracleLob(0);MemoryStream ms = new MemoryStream(byte)blob.Value);/ 对数据流执行某些操作ms.Close();if(!dr.IsDBNull(1)clob = dr.GetOracleLob(1).Value.ToString();if(!dr.IsDBNull(2)nclob = dr.GetOracleLob(2).Value.ToString();Console.WriteLine("BLOB length = " + blob.Length + " " +clob.T

34、oString() + " " + nclob.ToString(); dr.Close();conn.Close();控制台输出为:BLOB length = 1171; test CLOB text; test NCLOB text返回页首RAW存储不希望被解释的可变长度的二进制数据或其他数据。Oracle 不会象处理 VARCHAR2 那样试图解释这些 RAW 数据,例如不会转换字符集或填充空白。RAW 数据类型是为了与现有应用程序兼容而提供的,在新的应用程序中,应该使用 LOB 和 BFILE 数据类型。有两种 RAW 类型: RAW 与 VARCHAR2 的最大长

35、度相同(32767 字节),声明变量时必须指定此长度。 LONG RAW 可变长度的二进制数据,最大长度为 2GB。一个表格中只允许有一个 LONG RAW 数据类型。 以下代码将创建一个包含 RAW 和 LONG RAW 列的表格:OracleCommand cmd = conn.CreateCommand();cmd.CommandText = "CREATE TABLE MyRawTable (Id NUMBER, RawCol RAW(50), LongRawCol LONG RAW)"cmd.ExecuteNonQuery();以下代码将创建一个行并将数据插入到

36、RAW 和 LONG RAW 列中:在 RAW 字段中插入字节数组,而在 LONG RAW 字段中插入用户选定的文件的内容:OpenFileDialog ofd = new OpenFileDialog();if (ofd.ShowDialog() = DialogResult.OK)/ 创建 RAWbyte raw = new byte50;for (byte i = 0; i < raw.Length; i+)rawi = i;/ 创建 LONGRAWFileStream fs = new FileStream(ofd.FileName,FileMode.Open, FileAcce

37、ss.Read);byte longRaw = new bytefs.Length;fs.Read(longRaw, 0, raw.Length);fs.Close();OracleDataAdapter da = new OracleDataAdapter("SELECT Id, RawCol, LongRawCol FROM MyRawTable", CONNECTSTRING);DataTable dt = new DataTable();/ 获取架构da.FillSchema(dt, SchemaType.Source);OracleCommandBuilder c

38、b = new OracleCommandBuilder(da);int id = 1;/ 创建一个包含该数据的行DataRow row = dt.NewRow();row"Id" = id;row"RawCol" = raw;row"LongRawCol" = longRaw;/ 更新表格da.Update(dt);以下代码将 RAW 和 LONG RAW 字段中的数据检索到 OracleBinary 结构中:int id = 1;OracleBinary raw = null;OracleBinary longRaw = null

39、;OracleConnection conn = new OracleConnection(CONNECTSTRING);OracleCommand cmd = new OracleCommand("SELECT RawCol, LongRawCol FROM MyRawTable WHERE Id = " + id, conn);conn.Open();OracleDataReader dr = cmd.ExecuteReader();if(dr.Read()if(!dr.IsDBNull(0)raw = dr.GetOracleBinary(0);if(!dr.IsDB

40、Null(1)longRaw = dr.GetOracleBinary(1);dr.Close();conn.Close(); 返回页首REF CURSOR此数据类型指向 PL/SQL 查询所返回的结果集。REF CURSOR 被用作输出参数,负责将结果集从 Oracle 结构化程序返回给调用应用程序。可以在行集内移动游标以返回多行。使用 REF CURSOR 输出参数将结果集从 Oracle 结构化程序返回给调用应用程序。以下数据包和数据包正文将 REF CURSOR 返回给 HR.EMPLOYEES 表格中包含所有员工的结果集。数据包定义如下:CREATE OR REPLACE PACKA

41、GE GET_EMPLOYEES ASTYPE T_CURSOR IS REF CURSOR;PROCEDURE GetEmployees (cur_Employees OUT T_CURSOR);END GET_EMPLOYEES;数据包正文定义一个单独的过程,该过程检索所有员工的所有数据并作为一个 REF CURSOR 输出参数返回:CREATE OR REPLACE PACKAGE BODY GET_EMPLOYEES ASPROCEDURE GetEmployees (cur_Employees OUT T_CURSOR)ISBEGINOPEN cur_Employees FORSEL

42、ECT * FROM EMPLOYEES;END GetEmployees;END GET_EMPLOYEES;以下代码显示如何使用 OracleDataReader 检索存储过程 GetEmployees 返回的结果集。/ 创建连接OracleConnection conn = new OracleConnection(CONNECTSTRING);/ 为存储过程创建命令OracleCommand cmd = new OracleCommand();cmd.Connection = conn;cmd.CommandText = "GET_EMPLOYEES.GetEmployees

43、"cmd.CommandType = CommandType.StoredProcedure;/ 添加 REF CURSOR 参数以检索结果集ParameterDirection.Output;/ 打开连接并创建 DataReaderconn.Open();OracleDataReader dr = cmd.ExecuteReader();/ 输出员工的 ID、姓名和电子邮件地址(前四个字段)/ 并关闭连接。while(dr.Read()for(int i = 0; i <= 3; i+)Console.Write(dri.ToString() + "");

44、Console.WriteLine();conn.Close();控制台输出将列出所有员工的 ID、姓名和电子邮件地址。前五行为:100;Steven;King;SKING;101;Neena;Kochhar;NKOCHHAR;102;Lex;De Haan;LDEHAAN;103;Alexander;Hunold;AHUNOLD;104;Bruce;Ernst;BERNST;返回页首ROWIDOracle 使用此数据类型存储数据库中每一行的唯一地址。ROWID 类型包括: ROWID 10 字节长的数据类型,用于表示数据库中某行的页、记录和偏移地址。其值以 bbbbbbbb.ssss.fff

45、f 格式表示实际显示的二进制数据,其中: bbbbbbbb 为块 ID ssss 为块中的序列 ffff 为文件 ID UROWID 通用 ROWID (UROWID),它支持逻辑和物理 ROWID 以及外部表格(包括非 Oracle 表格)的 ROWID。UROWID 的最大长度为 4000 字节。 ROWID 伪列每个表格都有一个名为 ROWID 的伪列,它允许您使用保留字 ROWID 作为列名来访问任意行的地址。ROWID 伪列不存储在数据库中,不占用任何空间,也不能被修改或删除。只要表格中存在某个行,就不能修改该行的 ROWID,ROWID 提供了访问表格行的最快方式。 以下代码将创建

46、一个包含 ROWID 和 UROWID 列的表格:OracleCommand cmd = conn.CreateCommand();cmd.CommandText = "CREATE TABLE MyRowidTable (Id NUMBER, RowidCol ROWID,UrowidCol UROWID)"cmd.ExecuteNonQuery();以下代码将创建一条记录并在 ROWID 和 UROWID 字段中存储 HR.Employees 表格中第一行的 ROWID 伪列的值:int id = 1;OracleString rowId = null;OracleCo

47、nnection conn = new OracleConnection(CONNECTSTRING);conn.Open();/ 获取 HR.Employees 中第一行的 ROWID 伪列的值OracleCommand cmd =new OracleCommand("SELECT ROWID FROM HR.Employees", conn);OracleDataReader dr = cmd.ExecuteReader();if(dr.Read()rowId = dr.GetOracleString(0);conn.Close();/ 将 ROWID 伪列的值存储到

48、ROWID 和 UROWID 字段中OracleDataAdapter da = new OracleDataAdapter("SELECT ID, RowidCol,UrowidCol FROM MyRowidTable", CONNECTSTRING);DataTable dt = new DataTable();da.FillSchema(dt, SchemaType.Source);OracleCommandBuilder cb = new OracleCommandBuilder(da);DataRow row = dt.NewRow();row"Id&

49、quot; = id;row"RowidCol" = rowId;row"UrowidCol" = rowId;da.Update(dt);以下代码将检索 ROWID 和 UROWID 列中的值,然后使用检索到的值检索 HR.Employees 表格中的第一行:int id = 1;OracleString rowId = null;OracleString urowId = null;/ 获取 ROWID 和 UROWID 的值OracleConnection conn = new OracleConnection(CONNECTSTRING);Ora

50、cleCommand cmd = new OracleCommand("SELECT RowidCol, UrowidCol FROMMyRowIdTable WHERE Id = " + id, conn);conn.Open();OracleDataReader dr = cmd.ExecuteReader();if(dr.Read()rowId = dr.GetOracleString(0);urowId = dr.GetOracleString(1);Console.WriteLine(rowId + " " + urowId);int empl

51、oyeeId;string firstName;string lastName;/ 从 EMPLOYEES 表格中获取行cmd = new OracleCommand("SELECT * FROM Employees WHERE ROWID = '" +rowId.Value + "'", conn);dr = cmd.ExecuteReader();if(dr.Read()employeeId = dr.GetInt32(0);firstName = dr.GetString(1);lastName = dr.GetString(2);

52、Console.WriteLine(employeeId.ToString() + " " + firstName + " " +lastName);conn.Close();控制台输出为:AAAHM7AAFAAAABWAAA; AAAHM7AAFAAAABWAAA100; Steven; King返回页首Timestamp用于表示日期/时间值的数据类型。此数据类型向 DATE 类型添加小数秒以提高精度。Timestamp 数据类型使用精度参数定义秒字段中存储的数据的精度,精度值范围从 0 到 9,默认值为 6。有三种 Timestamp 数据类型: T

53、IMESTAMP 用于表示日期/时间的可变大小值,大小范围从 7 个字节到 11 个字节。 TIMESTAMP WITH TIME ZONE 13 个字节的固定大小值,除日期/时间外还包括时区。可以使用 UTC 偏移(与英国格林威治零子午线的当前时间或格林威治标准时间 GMT 之间的时差)或 V$TIMEZONE_NAMES 表格中的时区名来设置时区。您可以使用以下查询获取有效区域的列表:SELECT tzname, tzabbrev FROM V$TIMEZONE_NAMESTIMESTAMP WITH LOCAL TIME TIMESTAMP 的值与 TIMESTAMP WITH TIME

54、 ZONE 的值类似,只是数据被规范化为数据库服务器的时区。此数据类型允许您调整日期/时间以说明时区差异,包括该时区是否遵守夏时制。不会存储 UTC 偏移。 以下代码将创建一个包含 TIMESTAMP、TIMESTAMP WITH TIMEZONE 和 TIMESTAMP WITH LOCAL TIME ZONE 列的表格:OracleCommand cmd = conn.CreateCommand();cmd.CommandText = "CREATE TABLE MyTimestampTable (Id NUMBER,TimestampCol TIMESTAMP, TimeSta

55、mpTZCol TIMESTAMP WITH TIME ZONE,TimeStampLTZCol TIMESTAMP WITH LOCAL TIME ZONE)"cmd.ExecuteNonQuery();以下代码将当前时间插入到每个 Timestamp 数据类型的列中: int id = 1;DateTime timestampCol = DateTime.Now;DateTime timestampTZCol = DateTime.Now;DateTime timestampLTZCol = DateTime.Now;OracleConnection conn = new Ora

56、cleConnection(CONNECTSTRING);conn.Open();OracleCommand cmd = conn.CreateCommand(); cmd.CommandText = "INSERT INTO MyTimestampTable VALUES (" + id + ", '" +timestampCol.ToString("dd MMM yyyy hh:mm:sstt") + "', '" +timestampTZCol.ToString("dd MM

57、M yyyy hh:mm:sstt") + "', '" +timestampLTZCol.ToString("dd MMM yyyy hh:mm:sstt") + "')"cmd.ExecuteNonQuery();conn.Close();以下代码将检索三种 Timestamp 数据类型的值:int id = 1;DateTime timestampCol;DateTime timestampTZCol;DateTime timestampLTZCol;OracleConnection conn = new OracleConnection(CONNECTSTRING);OracleCommand cmd = new OracleCommand("SELECT TimestampCol,TimestampTZCol, TimestampLTZCol FROM MyTimestampTable WHERE Id = " +id, conn);conn.Open();/ 获取 Timestamp 值

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论