ServerName:为ODBC的DSN名称。
NameLength1:指明参数ServerName数据的长度。 UserName:数据库用户名。
NameLength2:指明参数UserName数据的长度。 Authentication:数据库用户密码。
NameLength3:指明参数Authentication数据的长度。
关于ServerName,UserName,Authentication参数长度可以直接指定也可以指定为SQL_NTS表明参数是以NULL字符结尾。 示例代码:
retcode = SQLConnect(hdbc, (SQLCHAR*) \SQL_NTS, (SQLCHAR*) \
2.4.1.4 SQLExecDirect 直接执行SQL语句
SQLRETURN SQLExecDirect(
SQLHSTMT StatementHandle, SQLCHAR * StatementText, SQLINTEGER TextLength);
StatementHandle:SQL语句句柄,也就是前面提到的利用: SQLAllocHandle(SQL_HANDLE_STMT,hDBC,&hSTMT);申请的句柄。 StatementText:SQL语句。
TextLength:参数StatementText的长度,可以使用SQL_NTS表示字符串以NULL字符结尾。 如果函数执行成功,你将会得到一个结果集,否则将返回错误信息。
SQLExecDirect函数除可以执行 Select 语句外,还可以执行Insert,Update,Delete 语句,在执行修改SQL语句后可以利用SQLRowCount 函数来得到被更新的记录的数量。
2.4.1.5 SQLFetch 移动光标
SQLRETURN SQLFetch(SQLHSTMT StatementHandle);
在你调用SQLExecDirect执行SQL语句后,你需要遍历结果集来得到数据。StatementHandle是STMT句柄,此句柄必须是被执行过。
当调用SQLFetch 函数后,光标会被移动到下一条记录处,当光标移动到记录集的最后一条,函数将会返回SQL_NO_DATA。
要遍历所有的结果集可以利用下面的方法:
while(SQL_NO_DATA != SQLFetch(hSTMT)) //移动光标,一直到集合末尾 {//得到结果 }
2.4.1.6 SQLGetData 得到光标处的某列的值
SQLRETURN SQLGetData(
SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValuePtr, SQLINTEGER BufferLength, SQLINTEGER * StrLen_or_IndPtr); StatementHanlde:STMT句柄。 ClumnNumber:列号,以1开始。
TargetType:数据缓冲区(TargetValuePtr)的C语言数据类型,请参照图2.6。 BufferLength:数据缓冲区(TargetValuePtr)的长度。 StrLen_or_IndPtr:返回当前得到的字段的字节长度。 下面是通过SQLFetch和SQLGetData得到记录集的例子: //假设 SQL = SELECT CUSTID, NAME, PHONE FROM CUSTOMERS SQLINTEGER sCustID
SQLCHAR szName[50], szPhone[50];
SQLINTEGER cbName, cbAge, cbBirthday;//用来保存得到的数据的长度 while (TRUE) {//循环得到所有行
retcode = SQLFetch(hstmt);//移动光标
if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) { printf(“error SQLFetch\\n”); }
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){ /*得到当前光标处每列的值 */
SQLGetData(hstmt, 1, SQL_C_ULONG, &sCustID, 0, &cbCustID);
//此处并没有指明BufferLength参数的值,是因为数据类型是定长的LONG型 SQLGetData(hstmt, 2, SQL_C_CHAR, szName, 50, &cbName); SQLGetData(hstmt, 3, SQL_C_CHAR, szPhone, 50,&cbPhone); printf(out, \ } else { break; } }
SQLGetData的另一个用处就是用于得到一些变长字段的实际长度,例如VARCHAR字段,TEXT字段。例如:
SQLGetData(hstmt, 2, SQL_C_CHAR, szName, 0, &cbName);
当你将 BufferLength 参数置为0,则会在 StrLen_or_IndPtr 参数中返回字段的实际长度。但请注意第四个参数必须是一个合法的指针,不能够为NULL。
此外在得到字段的值时还存在一个数据类型转换的问题,比如说数据库内的字段类型为:INTEGER,那么你可以使用SQL_C_INTEGER,SQL_C_CHAR,SQL_C_ULONG数据类型来得到该字段的值。图2.7就说明了所有可能存在的转换关系。
图2.7
参考前面的图2.5和图2.6就可以看出ODBC可以在SQL的数据类型和C的数据类型间提供转换。
请注意我讲解图2.5时提到的时ODBC数据类型和SQL语言数据类型之间的对应关系,而这里提到的是数据之间的转换关系。
图中用圆点标出的交叉点为允许的类型转换,其中实心圆点标出的是默认的数据转换类型,空心圆点标出的是允许的数据转换类型(允许并不表明一定可以,例如Char类型可以转换为SQL_C_INTEGER,但是并不是总能成功,当字符为’123’时可以转换为整数123,而字
符为’odbc’时就不能成功)。例如数据库中的Char,VarChar类型默认都是对应
SQL_C_CHAR类型。你还可以看到所有的数据库字段类型都可以转换为SQL_C_CHAR类型,例如整数123可以转换为”123”,而浮点数1.23可以转换为”1.23”,日期的2002年10月1日可以转换为”2002-10-1”。所以在初学ODBC并且对性能要求不是非常高时可以用字符类型来得到数据库字段的值,这样做会比较方便。
2.4.1.7 SQLNumResultCols 得到结果集中列数
SQLRETURN SQLNumResultCols( SQLHSTMT StatementHandle, SQLSMALLINT * ColumnCountPtr); StatementHandle:STMT句柄 ColumnCountPtr:返回列数
2.4.1.8 SQLDescribeCol 得到结果集中列的描述
SQLRETURN SQLDescribeCol(
SQLHSTMT StatementHandle, SQLSMALLINT ColumnNumber, SQLCHAR * ColumnName, SQLSMALLINT BufferLength, SQLSMALLINT * NameLengthPtr, SQLSMALLINT * DataTypePtr, SQLUINTEGER * ColumnSizePtr, SQLSMALLINT * DecimalDigitsPtr, SQLSMALLINT * NullablePtr); StatementHandle:STMT句柄。
ColumnNumber:需要得到的列的序号,从1开始计算。 ColumnName:得到列的名称。