GBase8sV8.8
为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【GBase版本】:GBase8sV8.8
【操作系统】:Windows11
【CPU】:
【问题描述】*:
// create_testdbdb_debug.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sql.h>
#include <sqlext.h>
void print_error(SQLSMALLINT handle_type, SQLHANDLE handle, const char* action) {
SQLCHAR sqlstate[6];
SQLCHAR message[1024];
SQLINTEGER native_error;
SQLSMALLINT message_len;
SQLRETURN diag_ret;
SQLSMALLINT rec_num = 1;
printf("错误发生在: %s\n", action);
while ((diag_ret = SQLGetDiagRec(handle_type, handle, rec_num,
sqlstate, &native_error,
message, sizeof(message), &message_len))
== SQL_SUCCESS || diag_ret == SQL_SUCCESS_WITH_INFO) {
printf(" SQL状态: %s\n", sqlstate);
printf(" 原生错误: %d\n", (int)native_error);
printf(" 错误消息: %s\n", message);
rec_num++;
}
}
int main() {
SQLHENV env = SQL_NULL_HENV;
SQLHDBC dbc = SQL_NULL_HDBC;
SQLHSTMT stmt = SQL_NULL_HSTMT;
SQLRETURN ret;
printf("=== 创建 testdbdb 数据库 ===\n");
// 1. 分配环境句柄
ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
if (ret != SQL_SUCCESS) {
printf("分配环境句柄失败\n");
return 1;
}
// 2. 设置ODBC版本
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
// 3. 分配连接句柄
ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
if (ret != SQL_SUCCESS) {
printf("分配连接句柄失败\n");
SQLFreeHandle(SQL_HANDLE_ENV, env);
return 1;
}
// 4. 连接到sysmaster数据库
printf("连接到sysmaster...\n");
ret = SQLConnect(dbc,
(SQLCHAR*)"gbase01", SQL_NTS, // DSN
(SQLCHAR*)"gbasedbt", SQL_NTS, // 用户名
(SQLCHAR*)"GBase@123", SQL_NTS); // 密码
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("连接失败\n");
print_error(SQL_HANDLE_DBC, dbc, "连接");
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
SQLFreeHandle(SQL_HANDLE_ENV, env);
return 1;
}
printf("连接成功\n");
// 5. 分配语句句柄
ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
if (ret != SQL_SUCCESS) {
printf("分配语句句柄失败\n");
print_error(SQL_HANDLE_DBC, dbc, "分配语句句柄");
SQLDisconnect(dbc);
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
SQLFreeHandle(SQL_HANDLE_ENV, env);
return 1;
}
// 6. 先测试一个简单的查询
printf("\n先测试简单查询...\n");
ret = SQLExecDirect(stmt, (SQLCHAR*)"SELECT DBINFO('version', 'full') FROM systables WHERE tabid=1", SQL_NTS);
if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) {
SQLCHAR version[256];
SQLLEN version_ind;
SQLBindCol(stmt, 1, SQL_C_CHAR, version, sizeof(version), &version_ind);
if (SQLFetch(stmt) == SQL_SUCCESS) {
printf("数据库版本: %s\n", version);
}
SQLCloseCursor(stmt);
} else {
printf("简单查询失败\n");
print_error(SQL_HANDLE_STMT, stmt, "简单查询");
}
// 7. 尝试创建数据库(尝试多种语法)
printf("\n尝试创建数据库...\n");
const char* create_statements[] = {
"CREATE DATABASE testdbdb",
"CREATE DATABASE testdbdb IN rootdbs",
"CREATE DATABASE testdbdb WITH LOG",
"CREATE DATABASE testdbdb IN rootdbs WITH LOG",
"CREATE DATABASE testdbdb IN rootdbs WITH BUFFERED LOG",
"CREATE DATABASE testdbdb IN rootdbs WITH BUFFERED LOG MODE ANSI",
NULL
};
for (int i = 0; create_statements[i] != NULL; i++) {
printf("\n尝试方法 %d: %s\n", i+1, create_statements[i]);
ret = SQLExecDirect(stmt, (SQLCHAR*)create_statements[i], SQL_NTS);
if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) {
printf("✓ 数据库创建成功\n");
goto cleanup;
} else {
print_error(SQL_HANDLE_STMT, stmt, "创建数据库");
}
// 清除之前的错误状态
SQLCloseCursor(stmt);
}
printf("\n✗ 所有创建方法都失败\n");
// 8. 尝试查看当前用户权限
printf("\n=== 检查用户权限 ===\n");
ret = SQLExecDirect(stmt, (SQLCHAR*)"SELECT USER, SITENAME FROM sysmaster:sysdual", SQL_NTS);
if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) {
SQLCHAR user[256], sitename[256];
SQLLEN user_ind, sitename_ind;
SQLBindCol(stmt, 1, SQL_C_CHAR, user, sizeof(user), &user_ind);
SQLBindCol(stmt, 2, SQL_C_CHAR, sitename, sizeof(sitename), &sitename_ind);
if (SQLFetch(stmt) == SQL_SUCCESS) {
printf("当前用户: %s\n", user);
printf("站点名: %s\n", sitename);
}
SQLCloseCursor(stmt);
}
cleanup:
// 9. 清理资源
if (stmt != SQL_NULL_HSTMT) {
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
}
if (dbc != SQL_NULL_HDBC) {
SQLDisconnect(dbc);
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
}
if (env != SQL_NULL_HENV) {
SQLFreeHandle(SQL_HANDLE_ENV, env);
}
printf("\n=== 完成 ===\n");
return 0;
}
连接到sysmaster...
连接成功
先测试简单查询...
数据库版本: GBase Server Version 12.10.FC4G1TL
尝试创建数据库...
尝试方法 1: CREATE DATABASE testdbdb
错误发生在: 创建数据库
SQL状态: HY000
原生错误: -11060
错误消息: [GBasedbt][GBasedbt ODBC Driver]General error.
尝试方法 2: CREATE DATABASE testdbdb IN rootdbs
错误发生在: 创建数据库
SQL状态: HY000
原生错误: -11060
错误消息: [GBasedbt][GBasedbt ODBC Driver]General error.
尝试方法 3: CREATE DATABASE testdbdb WITH LOG
错误发生在: 创建数据库
SQL状态: HY000
原生错误: -11060
错误消息: [GBasedbt][GBasedbt ODBC Driver]General error.
尝试方法 4: CREATE DATABASE testdbdb IN rootdbs WITH LOG
错误发生在: 创建数据库
SQL状态: HY000
原生错误: -11060
错误消息: [GBasedbt][GBasedbt ODBC Driver]General error.
尝试方法 5: CREATE DATABASE testdbdb IN rootdbs WITH BUFFERED LOG
错误发生在: 创建数据库
SQL状态: HY000
原生错误: -11060
错误消息: [GBasedbt][GBasedbt ODBC Driver]General error.
尝试方法 6: CREATE DATABASE testdbdb IN rootdbs WITH BUFFERED LOG MODE ANSI
错误发生在: 创建数据库
SQL状态: HY000
原生错误: -11060
错误消息: [GBasedbt][GBasedbt ODBC Driver]General error.
✗ 所有创建方法都失败
=== 检查用户权限 ===
=== 完成 ===
评论
HResult=0x80131620
Message=SQL0035N The file "zh_cn\GBS.Data.GBasedbt.xml" cannot be opened.
Source=GBS.Data.GBasedbt
StackTrace:
在 GBS.Data.Utilities.IfxResource..ctor(CultureInfo cultureInfo, String dirName, String fileName, String szMsgPath, String xpath)
在 GBS.Data.Utilities.IfxResources.GetResource(CultureInfo cultureInfo, String xpath)
在 GBS.Data.GBasedbt.IfxException.get_Message()
在 MyTest.FSqlDB.HasDb() 在 E:\ReportTest\MyTest\MyTest\FSqlDB.cs 中: 第 276 行
热门帖子
- 12025-12-01浏览数:182763
- 22023-05-09浏览数:25057
- 42023-09-25浏览数:18525
- 52020-05-11浏览数:17528