GBase 8s
适配迁移
问答

GBase8sV8.8

发表于2026-01-04 14:29:44138次浏览11个评论

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

【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.

✗ 所有创建方法都失败

=== 检查用户权限 ===

=== 完成 ===

 

评论

登录后才可以发表评论
GBase用户17182发表于 7个月前
参考这个https://www.gbase.cn/community/post/4408
用户头像
路路路发表于 7个月前
@GBase用户17182:赞~
GBase大圣发表于 7个月前
@路路路:System.IO.IOException
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 行

GBase用户17182发表于 7个月前
@GBase用户17182:https://www.gbase.cn/community/post/4407
用户头像
liaosnet发表于 7个月前
odbc中不允许使用create database
最佳回答
GBase大圣发表于 7个月前
@liaosnet:收到 ,谢谢
用户头像
大力发表于 7个月前
太牛了
用户头像
GBase用户28017发表于 7个月前
能安装在Win11吗?
GBase用户47954发表于 3个月前
感谢作者的精彩分享!
新疆油腻大叔发表于 2个月前
好问题啊。
GBase用户51935发表于 2个月前
不清楚啊。