以下行有效。它打印成功。
wchar_t * s1 = (wchar_t *) L"INSERT INTO OE(sqltext) VALUES('this text')";
if(WriteToSQL(s1) == 0)
printf( "Success"); //Success
else
printf( "Failed");
我需要用户输入来创建动态sql。我需要做什么 L前缀正在做。
当我接受输入并执行所需的转换时,它不起作用。
char input[100];
char sql[500];
printf("Enter input string :: ");
fgets(input,100,stdin);
for(int i=0;i<100;i++)
if(input[i]==10)
input[i]=0;
strcpy(sql,"INSERT INTO OE(sqltext) VALUES('");
strcat(sql,input);
strcat(sql,"')");
wchar_t wsql[500];
MultiByteToWideChar( CP_UTF8, 0, sql, strlen(sql),
wsql, strlen(sql) + 1 );
if(WriteToSQL(wsql) == 0)
printf( "Success");
else
printf( "Failed"); // It failed
长时间的交谈,但最终确实奏效了。来自usta的十六进制内存转储和输入是最有帮助的。谢谢大家的时间。
答案 0 :(得分:2)
您不能只将char *
转换为wchar_t *
并期望它能够正常运行。您必须进行适当的转换,例如使用MultiByteToWideChar
函数。
一般来说,要非常小心类型转换,特别是避免在C ++程序中使用C风格的转换。这种情况就是一个很好的例子:你告诉编译器关闭((SQLWCHAR *) sql
),并在运行时遇到问题。只有当你完全确定你做的是正确的事情时才使用强制转换,并且比编译器更清楚。毫不奇怪,这种情况相对罕见......
答案 1 :(得分:1)
为什么不全程使用宽字符? 像这样:
wchar_t input[100];
wchar_t sql[500];
wprintf(L"Enter input string :: ");
fgetws(input,100,stdin);
for(int i=0;i<100;i++)
if(input[i]==10)
input[i]=0;
wcscpy(sql,L"INSERT INTO OE(sqltext) VALUES('");
wcscat(sql,input);
wcscat(sql,L"')");
if(WriteToSQL(sql) == 0)
printf( "Success");
else
printf( "Failed"); // It failed
警告:我没有测试它,但它应该可以工作。
答案 2 :(得分:0)
Manjoor,通过使用_tmain,您选择使用通用文本,因此请保持一致并尝试在整个程序中坚持使用通用文本类型。这样你的代码就会变得更干净,你不需要像MultiByteToWideChar那样使用令人讨厌的字符串转换。如果您有能力更改WriteToSQL函数签名,请将参数's'作为SQLTCHAR *类型传递。将sql和输入变量声明为TCHAR数组,使用来自TCHAR.H的字符串例程(例如_tprintf而不是printf,_T()宏用于硬编码字符串......)。对于您正在使用的每个例程,请转到其MSDN页面并检查通用文本例程映射以查看您应使用的例程。
Google支持Microsoft对UNICODE的支持,以便更好地了解您提供的示例中的问题。