Tag: odbc

对于SQLCHAR类型参数,ODBC SQLBindParameter的ColumnSize参数可以是strlen(param)+ 1吗?

SQLBindParameter函数的示例位于http://msdn.microsoft.com/en-us/library/ms710963(v=vs.85).aspx时 ,将字符数组的大小作为ColumnSize参数(第6个参数)传递给C时type是SQL_C_CHAR 。 从该页面引用部分示例: SQLCHAR szEmployeeID[EMPLOYEE_ID_LEN]; SQL_DATE_STRUCT dsOrderDate; SQLINTEGER cbCustID = 0, cbOrderDate = 0, cbEmployeeID = SQL_NTS; … retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, EMPLOYEE_ID_LEN, 0, szEmployeeID, 0, &cbEmployeeID); 我想知道是否可以将字符串参数的长度加1作为ColumnSize参数。 换句话说,如果我们假设szEmployeeID包含以null结尾的字符串,我想知道以下调用是否正常。 retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(szEmployeeID) + 1, 0, szEmployeeID, 0, &cbEmployeeID); 我相信这对于这样的调用非常有用: SQLLEN nts = SQL_NTS; retcode = SQLBindParameter(hstmt, […]

如何在创建数据库时指定ODBC访问驱动程序格式

使用C,我试图通过SQLConfigDataSource函数使用ODBC创建Access 2007数据库文件。 char szDriverName[] = “Microsoft Access Driver (*.mdb, *.accdb)”; char szAttr[] = “CREATE_DB=c:\access2007.accdb”; SQLConfigDataSource(NULL, ODBC_ADD_DSN, szDriverName, szAttr); 我希望新数据库的文件扩展名为.accdb,但是当我运行上面的代码时,我总是得到c:\ access2007.accdb.mdb。 我可以从ODBC Admin中指定12.x(accdb)或4.x(mdb),如下图所示,但是如何通过ODBC API执行此操作? 我能够创建用户DSN,但我觉得它也是错误的格式,因为我还没有测试过它。 如何使用ODBC / Access API定义格式版本?

查找一个如何使用ODBC API将空值绑定并插入数据库的线性示例

function是 SQLRETURN SQLBindParameter( SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber, SQLSMALLINT InputOutputType, SQLSMALLINT ValueType, SQLSMALLINT ParameterType, SQLULEN ColumnSize, SQLSMALLINT DecimalDigits, SQLPOINTER ParameterValuePtr, SQLLEN BufferLength, SQLLEN * StrLen_or_IndPtr); 我见过的文件令人困惑。 请问是否依赖于数据类型我在这里找到了一个示例http://support.microsoft.com/kb/248799 ,它似乎不适用于DB2。 我认为odbc在数据库中是一致的。 一个特定的代码示例他会有所帮助。

我应该将哪种数据类型绑定为查询参数以与Oracle ODBC中的NUMBER(15)列一起使用?

我刚刚被SO问题Binding int64(SQL_BIGINT)中描述的问题所困扰,因为查询参数在Oracle 10g ODBC中执行期间会导致错误 。 我正在使用ODBC 2从SQL Server移植到Oracle的C / C ++应用程序。 对于超过NUMBER(9)的数字字段,它使用__int64数据类型,该数据类型作为SQL_C_SBIGINT绑定到查询。 显然,Oracle ODBC不支持这种绑定。 我现在必须进行应用程序范围的转换到另一种方法。 由于我没有太多时间 – 这是一个意想不到的问题 – 我宁愿使用经证实的解决方案,而不是试错。 应该使用什么数据类型来绑定,例如Oracle中的NUMBER(15)? 有记录建议的解决方案吗? 你在用什么? 有什么建议? 我对不需要任何额外转换的解决方案特别感兴趣。 我可以轻松地以__int64或char *的forms提供和使用数字(正常的非指数forms,没有千位分隔符或小数点)。 任何其他格式都需要我的额外转换。 到目前为止我尝试了什么: SQL_C_CHAR 看起来它对我有用。 我担心数字格式的可变性。 但在我的用例中它似乎并不重要。 显然只有分数点字符随系统语言设置而变化。 我不明白为什么我应该在SQL INSERT或UPDATE命令中使用显式强制转换(例如TO_NUMERIC)。 当我将参数与SQL_C_CHAR作为C类型绑定并且SQL_NUMERIC(具有适当的精度和比例)作为SQL类型绑定时,一切正常。 我无法重现任何数据损坏效果。 SQL_NUMERIC_STRUCT 我注意到SQL_NUMERIC_STRUCT添加了ODBC 3.0并决定尝试一下。 我很失望。 在我的情况下,这已经足够了,因为应用程序并不真正使用小数。 但作为一般解决方案……简单地说,我不明白。 我的意思是,我终于理解了应该如何使用它。 我没有得到的是: 为什么有人会引入这种新结构,然后以这种方式工作 。 SQL_NUMERIC_STRUCT具有表示任何NUMERIC(或NUMBER或DECIMAL)值及其精度和比例所需的所有字段。 只有它们不被使用。 在读取时,ODBC设置数字的精度(基于列的精度;除了Oracle返回更高的精度,例如对于NUMBER(15)为20)。 但是,如果您的列具有小数部分(比例> 0),则默认情况下将其截断。 要以适当的比例读取数字,您需要在获取数据之前使用SQLSetDescField调用设置精度并自行调整。 在编写时,Oracle非常感谢尊重SQL_NUMERIC_STRUCT中包含的规模。 […]

语句处理(hstmt)究竟是做什么的? 在ODBC中

我是新编写ODBC的c代码,但在这里我有疑问…在为C搜索odbc函数教程的教程之后,我仍然知道他们如何协同工作…… 该语句处理hstmt对数据库数据的作用是什么? 我知道它控制我作为参数提供的SQL查询语句。 但是,那么我作为查询提供的每个SQL语句都应该为每个语句处理(hstmt)? 或几个SQL查询语句的一个语句句柄? 例如, lstrcpy((LPTSTR)update, L”insert into employee values (‘Dshong’,’summer’,’LosAngeles’);”); SQLExecDirect(hstmt1, update, SQL_NTS); lstrcpy((LPTSTR)update, L”insert into works values (‘Dshong’,’Small Bank’, 2500);”); SQLExecDirect(hstmt3, update1, SQL_NTS); lstrcpy((LPTSTR)select, L”select * from works;”); if (SQLExecDirect(hstmt, select, SQL_NTS) != SQL_SUCCESS) return printf(“can’t exec direct”); lstrcpy((LPTSTR)select1, L”select * from employee;”); if (SQLExecDirect(hstmt2, select1, SQL_NTS) != SQL_SUCCESS) return printf(“can’t exec […]

ODBC v Libpq:PostgreSQL的C库

我将使用C库连接和使用PostgreSQL数据库,我想知道ODBC和Libpq的优缺点是什么。 据我所知,libpq似乎更快,但我无法获得任何明确的答案或基准。 还有,还有其他任何可能比ODBC / Libpq更好的库。

什么是特权教育?

我添加了一些编译干净,刚收到此Windows错误的代码: ————————— (MonTel Administrator) 2.12.7: MtAdmin.exe – Application Error ————————— The exception Privileged instruction. (0xc0000096) occurred in the application at location 0x00486752. 我即将继续寻找一个bug,我期待它是一件愚蠢的事情,我已经完成了这件事,恰好产生了这个消息。 代码编译干净,没有错误或警告。 EXE文件的大小已增长到1,454,132字节并包含指向ODCS.lib链接,但它是纯粹的C到Win32 API,DEBUG打开(在Windows 2000上的P4上运行)。