HWND hwndParent,
WORD fRequest,
LPCSTR lpszDriver,
LPCSTR lpszAttributes)
设置数据源
从MSDN知道最后一个参数是数据源的各项参数,如“DSN=TryDB\0DBQ=D:\\Database\\
try.mdb\0”各项之间用‘\0’分隔,数据源名叫TryDB,文件名是D:\\Database\\
try.mdb
当用这样的字符串调用函数时结果完全正确。
而当文件名动态获得时,就不对了如:
LPCSTR strAttri = "DSN=TryDB\0DBQ="+CString(lpfullpathname)+"\\database\\try.mdb\0";
我觉得是中间的\0的问题,不知道怎么解决。
30 个解决方案
#1
有些不是以'\0'而是以0来结束的.
#2
你应该用strcpy和strcat,注意要先给strAttri分配空间,
或者简单的办法是你用CString操作字符串,最后用的时候(LPCTSTR)强制转化一下就好了
或者简单的办法是你用CString操作字符串,最后用的时候(LPCTSTR)强制转化一下就好了
#3
是不是字符串加的问题,跟踪一下,看看加之后字符串的值
#4
'\0'和0是一个东西
#5
'\0'和0是一个东西
#6
我也用过CString 运算后,转化成LPCTSTR,结果也不正确。
#7
不是,最后应该有两个\0
#8
这是ODBC sdk参考的原文:
ConfigDSN以在关键字值对表格的属性列表,从安装程序DLL接受连接信息。每对以空字节结束,并且整个列表以空字节结束(即是,两个空字节标记列表结束)。在关键字值对,不允许等号旁有空格。ConfigDSN能接受对SQLBrowseConnect和SQLDriverConnect无效的关键字。ConfigDSN不需要支持所有对SQLBrowseConnect和SQLDriverConnect有效的关键字(ConfigDSN不接受DRIVER关键字)。ConfigDSN函数使用的关键字必须支持使用安装程序的AUTO设置特性重新创建数据源的所有选项。ConfigDSN使用的值和连接字符串值相同时,使用相同的关键字。
ConfigDSN以在关键字值对表格的属性列表,从安装程序DLL接受连接信息。每对以空字节结束,并且整个列表以空字节结束(即是,两个空字节标记列表结束)。在关键字值对,不允许等号旁有空格。ConfigDSN能接受对SQLBrowseConnect和SQLDriverConnect无效的关键字。ConfigDSN不需要支持所有对SQLBrowseConnect和SQLDriverConnect有效的关键字(ConfigDSN不接受DRIVER关键字)。ConfigDSN函数使用的关键字必须支持使用安装程序的AUTO设置特性重新创建数据源的所有选项。ConfigDSN使用的值和连接字符串值相同时,使用相同的关键字。
#9
LPCTSTR 不能像CString那样+的
#10
空终止符的字符串就是一般的字符串,比如char str[5]="ABCD";就是一个{'A','B','C','D',0}的数组
#11
楼上的,估计楼主还不至于吧:目
#12
楼上的,估计楼主还不至于吧:目
#13
跟踪一下,看
LPCSTR strAttri = "DSN=TryDB\0DBQ="+CString(lpfullpathname)+"\\database\\try.mdb\0";
这行执行万之后,LPCSTR等于什么,不过最后好像需要两个'\0'吧?
LPCSTR strAttri = "DSN=TryDB\0DBQ="+CString(lpfullpathname)+"\\database\\try.mdb\0";
这行执行万之后,LPCSTR等于什么,不过最后好像需要两个'\0'吧?
#14
两个‘\0’也试了,也不行。跟踪了,看不到值。
#15
现在的问题是‘\0’在字符串中怎么表示,字符串中都是以'\0'结尾的啊,会不会把后面的忽略了,如果那样怎么表示呢?
#16
LPCSTR有怎么来运算呢,难道没办法吗?各位
#17
DSN=Personnel Data\0UID=Smith\0PWD=Sesame\0DATABASE=Personnel\0\0
抱歉,那你应该用
char str[256];
char *p=str;
int iLen=0;
strcpy(p,"DSN=Personnel Data");
iLen=strlen(p);
p+=iLen+1;
strcpy(p,"UID=Smith");
iLen=strlen(p);
p+=iLen+1;
//…………
p[0]=0;
抱歉,那你应该用
char str[256];
char *p=str;
int iLen=0;
strcpy(p,"DSN=Personnel Data");
iLen=strlen(p);
p+=iLen+1;
strcpy(p,"UID=Smith");
iLen=strlen(p);
p+=iLen+1;
//…………
p[0]=0;
#18
不要用CString的运算
#19
用memcpy
#20
不要用CString类字串。你试试这个行不行:(有可能不成功的)
char filename[1024];
strcpy(filename,"c:\\db\\customer.mdb");
char connectstr[2048];
ZeroMemory(connectstr,2048);//这样有两个\0\0也不怕了。
strcpy(connectstr,"DSN=TryDB\0DBQ=");
//这里有个\0,可能复制不过去。实在不行就不用什么strcpy与strcat,用connectstr[i]数组循环操作数据。
strcat(connectstr,filename);
char filename[1024];
strcpy(filename,"c:\\db\\customer.mdb");
char connectstr[2048];
ZeroMemory(connectstr,2048);//这样有两个\0\0也不怕了。
strcpy(connectstr,"DSN=TryDB\0DBQ=");
//这里有个\0,可能复制不过去。实在不行就不用什么strcpy与strcat,用connectstr[i]数组循环操作数据。
strcat(connectstr,filename);
#21
哈哈,好像就是这个问题:在CString 中0不认为是其结束符只有'\0'才被认为是结束符,而在char中0则被认为是结束符,我估计是你CString 和LPCSTR转化的时候出现了问题!
#22
bluebohe(薄荷)说的不完整啊,: yl0002(yl) 说的也不行啊。有没有人使用过这个函数的?
#23
不完整吗?比如说我想将str赋值成以下值
DSN=Personnel Data\0UID=Smith\0PWD=Sesame\0DATABASE=Personnel\0\0
通过以下程序
char str[256];
char *p=str;
int iLen=0;
strcpy(p,"DSN=Personnel Data");
iLen=strlen(p);
p+=iLen+1;
strcpy(p,"UID=Smith");
iLen=strlen(p);
p+=iLen+1;
strcpy(p,"PWD=Sesame");
iLen=strlen(p);
p+=iLen+1;
strcpy(p,"DATABASE=Personnel");
iLen=strlen(p);
p+=iLen+1;
p[0]=0;
这样子str不是就达到你的要求了吗?我调试过了,应该可以用吧
DSN=Personnel Data\0UID=Smith\0PWD=Sesame\0DATABASE=Personnel\0\0
通过以下程序
char str[256];
char *p=str;
int iLen=0;
strcpy(p,"DSN=Personnel Data");
iLen=strlen(p);
p+=iLen+1;
strcpy(p,"UID=Smith");
iLen=strlen(p);
p+=iLen+1;
strcpy(p,"PWD=Sesame");
iLen=strlen(p);
p+=iLen+1;
strcpy(p,"DATABASE=Personnel");
iLen=strlen(p);
p+=iLen+1;
p[0]=0;
这样子str不是就达到你的要求了吗?我调试过了,应该可以用吧
#24
如果要把str赋值成上面的,只要把\0写成\\0不就行了,两个\在字符串里是一个啊,肯定不行的。
#25
我上面的程序的意思是把str写成
DSN=Personnel Data UID=Smith PWD=Sesame DATABASE=Personnel
'\0'分隔,而不是"\\0分隔"啊,
DSN=Personnel Data UID=Smith PWD=Sesame DATABASE=Personnel
'\0'分隔,而不是"\\0分隔"啊,
#26
用这个------------->';'或者'|'
#27
参考:
http://vcp4.51.net/VC/DataBase.htm
第1条
http://vcp4.51.net/VC/DataBase.htm
第1条
#28
参考:
http://vcp4.51.net/VC/DataBase.htm
第1条
http://vcp4.51.net/VC/DataBase.htm
第1条
#29
bluebohe(薄荷) 说的很正确,一定要用char*,而不能使用CString 操作,我已经测试通过,谢谢。
#30
呵呵,我以前没看清楚问题,就瞎发言,也不对啊
#1
有些不是以'\0'而是以0来结束的.
#2
你应该用strcpy和strcat,注意要先给strAttri分配空间,
或者简单的办法是你用CString操作字符串,最后用的时候(LPCTSTR)强制转化一下就好了
或者简单的办法是你用CString操作字符串,最后用的时候(LPCTSTR)强制转化一下就好了
#3
是不是字符串加的问题,跟踪一下,看看加之后字符串的值
#4
'\0'和0是一个东西
#5
'\0'和0是一个东西
#6
我也用过CString 运算后,转化成LPCTSTR,结果也不正确。
#7
不是,最后应该有两个\0
#8
这是ODBC sdk参考的原文:
ConfigDSN以在关键字值对表格的属性列表,从安装程序DLL接受连接信息。每对以空字节结束,并且整个列表以空字节结束(即是,两个空字节标记列表结束)。在关键字值对,不允许等号旁有空格。ConfigDSN能接受对SQLBrowseConnect和SQLDriverConnect无效的关键字。ConfigDSN不需要支持所有对SQLBrowseConnect和SQLDriverConnect有效的关键字(ConfigDSN不接受DRIVER关键字)。ConfigDSN函数使用的关键字必须支持使用安装程序的AUTO设置特性重新创建数据源的所有选项。ConfigDSN使用的值和连接字符串值相同时,使用相同的关键字。
ConfigDSN以在关键字值对表格的属性列表,从安装程序DLL接受连接信息。每对以空字节结束,并且整个列表以空字节结束(即是,两个空字节标记列表结束)。在关键字值对,不允许等号旁有空格。ConfigDSN能接受对SQLBrowseConnect和SQLDriverConnect无效的关键字。ConfigDSN不需要支持所有对SQLBrowseConnect和SQLDriverConnect有效的关键字(ConfigDSN不接受DRIVER关键字)。ConfigDSN函数使用的关键字必须支持使用安装程序的AUTO设置特性重新创建数据源的所有选项。ConfigDSN使用的值和连接字符串值相同时,使用相同的关键字。
#9
LPCTSTR 不能像CString那样+的
#10
空终止符的字符串就是一般的字符串,比如char str[5]="ABCD";就是一个{'A','B','C','D',0}的数组
#11
楼上的,估计楼主还不至于吧:目
#12
楼上的,估计楼主还不至于吧:目
#13
跟踪一下,看
LPCSTR strAttri = "DSN=TryDB\0DBQ="+CString(lpfullpathname)+"\\database\\try.mdb\0";
这行执行万之后,LPCSTR等于什么,不过最后好像需要两个'\0'吧?
LPCSTR strAttri = "DSN=TryDB\0DBQ="+CString(lpfullpathname)+"\\database\\try.mdb\0";
这行执行万之后,LPCSTR等于什么,不过最后好像需要两个'\0'吧?
#14
两个‘\0’也试了,也不行。跟踪了,看不到值。
#15
现在的问题是‘\0’在字符串中怎么表示,字符串中都是以'\0'结尾的啊,会不会把后面的忽略了,如果那样怎么表示呢?
#16
LPCSTR有怎么来运算呢,难道没办法吗?各位
#17
DSN=Personnel Data\0UID=Smith\0PWD=Sesame\0DATABASE=Personnel\0\0
抱歉,那你应该用
char str[256];
char *p=str;
int iLen=0;
strcpy(p,"DSN=Personnel Data");
iLen=strlen(p);
p+=iLen+1;
strcpy(p,"UID=Smith");
iLen=strlen(p);
p+=iLen+1;
//…………
p[0]=0;
抱歉,那你应该用
char str[256];
char *p=str;
int iLen=0;
strcpy(p,"DSN=Personnel Data");
iLen=strlen(p);
p+=iLen+1;
strcpy(p,"UID=Smith");
iLen=strlen(p);
p+=iLen+1;
//…………
p[0]=0;
#18
不要用CString的运算
#19
用memcpy
#20
不要用CString类字串。你试试这个行不行:(有可能不成功的)
char filename[1024];
strcpy(filename,"c:\\db\\customer.mdb");
char connectstr[2048];
ZeroMemory(connectstr,2048);//这样有两个\0\0也不怕了。
strcpy(connectstr,"DSN=TryDB\0DBQ=");
//这里有个\0,可能复制不过去。实在不行就不用什么strcpy与strcat,用connectstr[i]数组循环操作数据。
strcat(connectstr,filename);
char filename[1024];
strcpy(filename,"c:\\db\\customer.mdb");
char connectstr[2048];
ZeroMemory(connectstr,2048);//这样有两个\0\0也不怕了。
strcpy(connectstr,"DSN=TryDB\0DBQ=");
//这里有个\0,可能复制不过去。实在不行就不用什么strcpy与strcat,用connectstr[i]数组循环操作数据。
strcat(connectstr,filename);
#21
哈哈,好像就是这个问题:在CString 中0不认为是其结束符只有'\0'才被认为是结束符,而在char中0则被认为是结束符,我估计是你CString 和LPCSTR转化的时候出现了问题!
#22
bluebohe(薄荷)说的不完整啊,: yl0002(yl) 说的也不行啊。有没有人使用过这个函数的?
#23
不完整吗?比如说我想将str赋值成以下值
DSN=Personnel Data\0UID=Smith\0PWD=Sesame\0DATABASE=Personnel\0\0
通过以下程序
char str[256];
char *p=str;
int iLen=0;
strcpy(p,"DSN=Personnel Data");
iLen=strlen(p);
p+=iLen+1;
strcpy(p,"UID=Smith");
iLen=strlen(p);
p+=iLen+1;
strcpy(p,"PWD=Sesame");
iLen=strlen(p);
p+=iLen+1;
strcpy(p,"DATABASE=Personnel");
iLen=strlen(p);
p+=iLen+1;
p[0]=0;
这样子str不是就达到你的要求了吗?我调试过了,应该可以用吧
DSN=Personnel Data\0UID=Smith\0PWD=Sesame\0DATABASE=Personnel\0\0
通过以下程序
char str[256];
char *p=str;
int iLen=0;
strcpy(p,"DSN=Personnel Data");
iLen=strlen(p);
p+=iLen+1;
strcpy(p,"UID=Smith");
iLen=strlen(p);
p+=iLen+1;
strcpy(p,"PWD=Sesame");
iLen=strlen(p);
p+=iLen+1;
strcpy(p,"DATABASE=Personnel");
iLen=strlen(p);
p+=iLen+1;
p[0]=0;
这样子str不是就达到你的要求了吗?我调试过了,应该可以用吧
#24
如果要把str赋值成上面的,只要把\0写成\\0不就行了,两个\在字符串里是一个啊,肯定不行的。
#25
我上面的程序的意思是把str写成
DSN=Personnel Data UID=Smith PWD=Sesame DATABASE=Personnel
'\0'分隔,而不是"\\0分隔"啊,
DSN=Personnel Data UID=Smith PWD=Sesame DATABASE=Personnel
'\0'分隔,而不是"\\0分隔"啊,
#26
用这个------------->';'或者'|'
#27
参考:
http://vcp4.51.net/VC/DataBase.htm
第1条
http://vcp4.51.net/VC/DataBase.htm
第1条
#28
参考:
http://vcp4.51.net/VC/DataBase.htm
第1条
http://vcp4.51.net/VC/DataBase.htm
第1条
#29
bluebohe(薄荷) 说的很正确,一定要用char*,而不能使用CString 操作,我已经测试通过,谢谢。
#30
呵呵,我以前没看清楚问题,就瞎发言,也不对啊