又一个关于导入、调用API函数的问题?高手请进...

project 2003-03-17 10:49:27
ms-help://MS.VSCC/MS.MSDNVS.2052/odbc/htm/odbcsqlbindcol.htm
SQLRETURN SQLBindCol(
SQLHSTMT StatementHandle,
SQLUSMALLINT ColumnNumber,
SQLSMALLINT TargetType,
SQLPOINTER TargetValuePtr,
SQLINTEGER BufferLength,
SQLLEN * StrLen_or_Ind);

//以下是声明中的数据类型在.NET中的对照关系。
using SQLRETURN = System.Int16;
using SQLUSMALLINT = System.UInt16;
using SQLSMALLINT = System.Int16;
using SQLLEN = System.Int64;
using SQLINTEGER = System.Int32;
using SQLHANDLE = System.IntPtr;
using SQLCHAR = System.Char;
using SQLPOINTER = System.IntPtr;

//以下是函数声明(不知对否)
[DllImport("odbc32.dll",EntryPoint="SQLBindCol")]
public static extern SQLRETURN SQLBindCol(
IntPtr StatementHandle,
SQLUSMALLINT ColumnNumber,
SQLSMALLINT TargetType,
SQLPOINTER TargetValuePtr,
SQLINTEGER BufferLength,
ref int StrLen_or_Ind);
//调用
IntPtr szColumnName = IntPtr.Zero;
int cbColumnName = 0;
int STR_LEN = 255;
int SQL_C_CHAR=1;
retcode=SQLBindCol(hstmt, 4, SQL_C_CHAR, szColumnName, STR_LEN, ref cbColumnName);

其中的TargetValuePtr应该为IntPtr。它有时是char[]有时是int,在c#中如何对这种参数进行声明并对其进行存取(不用指针)?不知道我如上的调用方法问题出在哪里?
System.Runtime.InteropServices.Marshal中有一些类似PtrToStringAuto等的函数不知怎么用啊?
我程序中其它部分都没问题,就在这卡住了。变量中总是没有数据,好像就没bind上。
...全文
59 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Knight94 2003-03-19
  • 打赏
  • 举报
回复
说说你想实现什么功能?
project 2003-03-19
  • 打赏
  • 举报
回复
我想取出数据库中的所有表的信息和字段信息(要支持所有的数据库)。
Knight94 2003-03-18
  • 打赏
  • 举报
回复
我看你调用的ODBC方面的API,有时C#在调用API是件很麻烦的事(可能最主要的原因就是它没有指针);其实,你要用C#写数据库方面的东西,我建议你用C#的SQL组件,例如:SqlConnection、SqlDataAdapter、SqlCommand、DataSet等等,这些都很方便,还不用考虑底层的东西,至于效率不一定比调用API差。
project 2003-03-18
  • 打赏
  • 举报
回复
是啊,我当然也像省点事。只是ODBC.NET中没有像OleDbConnection.GetOleDbSchemaTable这样的方法。所以只能自己通过导入ODBC API来实现。
Knight94 2003-03-17
  • 打赏
  • 举报
回复
主要是访问地址的问题,例如以下的例子,本来函数的参数是String,但我调用的时候,要用StringBuilder类型,要先给它分配内存,这样才能获取数据,估计其它类型也一样吧
[DllImport("CryptoDll.DLL", EntryPoint="GetMacAdd", SetLastError=true,
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern bool GetMacAdd(StringBuilder strMacAdd);
project 2003-03-17
  • 打赏
  • 举报
回复
Knight94() 具体我该怎么做呢?
我后来,把TargetValuePtr由SQLPOINTER改成了Byte[50],倒是可以了。但不知为何有时程序老是莫名其妙地没有任何提示就退出了?

111,119

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧