GBase 8s
安装配置
问答

.net framework 4.8 连接GBase数据库错误

发表于2025-12-31 11:53:52173次浏览19个评论

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

【GBase版本】:GBase8sV8.8_3.6.3_3X2_x86_64(开发版)

【操作系统】:windows 11

【CPU】:

【问题描述】*:     

 1.使用odbcConnection创建连接并打开conn后 执行查询没问题但是使用SQL执行CREATE DATABASE testdb WITH Buffered LOG 报错:System.Data.Odbc.OdbcException:“ERROR [HY000] [GBasedbt][GBasedbt ODBC Driver]General error.” 该语句在Dbeaver里面是可以正常执行并创建数据库的

2.使用GeneralData.GBase8s.DataProvider.1.0.0.1_win_x86_64 提供的dll  直接无法打开conn 

详细过程:建立连接开始报找不到iclit09b.dll,后面将GBase8s_3.6.3_3x2_1-Win64-ODBC-Driver\gbase8s-odbc-driver\bin 设置到系统Path后 执行conn.Open()时报错ERROR [HY000] [GBasedbt][GBasedbt ODBC Driver][GBasedbt]Unspecified System Error =  -23101. 错误。

连接测试代码如下所示

 public static OdbcConnection TestConnection(string dbName)
       {
           var connstrTest =
               $"Driver={{GBase ODBC DRIVER (64-bit)}};" // 注意大小写和括号
               + "Host=192.168.2.190;"
               + "Service=9088;"
               + "Server=gbase01;"
               + $"Database={dbName};"
               + "Protocol=onsoctcp;"
               + "Uid=gbasedbt;"
               + "Pwd=GBase@123;"
               + "Db_locale=zh_CN.utf8;"
               + "Client_locale=zh_CN.utf8";
           return new OdbcConnection(connstrTest);
       }

        public static GbsConnection GetGbsConnection(string dbName)
       {
           GbsConnectionStringBuilder builder = new GbsConnectionStringBuilder();


           // 设置连接参数
           builder.Host = "192.168.2.190";       // 数据库服务器IP
           builder.Service = "9088";  // 端口号
           builder.Protocol = "onsoctcp";
           builder.Server = "gbase01";            // 数据库服务名称
           builder.Database = dbName;          // 数据库名称
           builder.UID = "gbasedbt";             // 用户名
           builder.Pwd = "GBase@123";               // 密码
           builder.DbLocale = "zh_CN.utf8";     // 数据库字符集
           builder.ClientLocale = "zh_CN.utf8";  // 客户端字符集
           // 构建连接字符串
           var connstrTest = $"{builder.ConnectionString};";
           var conn = new GbsConnection(connstrTest);
           return conn;
       }

评论

登录后才可以发表评论
用户头像
liaosnet发表于 7个月前
使用管理员权限,通过setnet32设备好环境变量,重启一下你的电脑 ,基本上就OK.
GBase大圣发表于 7个月前
@liaosnet:求教setnet32环境变量 参数如何设置 我再系统Path里面设置 不起作用么?
GBase大圣发表于 7个月前
@liaosnet:我的驱动应该是没问题的 我直接建立odbc连接 指定driver后 可以连上执行Select SQL 但是执行CREATE DATABASE testdb WITH Buffered LOG 这句报错,也就是说创建不了实例。 在GBase8s_DataStudio里面执行这句SQL没问题,请大神赐教
用户头像
路路路发表于 7个月前
赞~
ZEalot发表于 7个月前
public static bool CheckGBaseDatabaseExists(string ip, string port, string user, string password, string databaseName)
{
try
{
string driver = (IntPtr.Size != 8) ? "DRIVER={GBase ODBC DRIVER};" : "DRIVER={GBase ODBC DRIVER (64-bit)};";
string[] strArray = new string[]
{
driver,
"Server=gbase01;",
"Host=", ip, ";",
"Service=", port, ";",
"Protocol=onsoctcp;",
"OPTIONS=;",
"UID=", user, ";",
"PWD=", password, ";",
"NEEDODBCTYPESONLY=1;",
"Database=sysmaster;",
"DbLocale=zh_CN.utf8;",
"ClientLocale=zh_CN.utf8"
};
string connectionString = string.Concat(strArray);

using (var connection = new OdbcConnection(connectionString))
{
connection.Open();
Console.WriteLine("✓ 连接成功");

// 测试查询 - 尝试不同的系统表
Console.WriteLine("\n=== 测试系统表查询 ===");

// 方法1:查询 sysdatabases
try
{
using (var cmd = connection.CreateCommand())
{
cmd.CommandText = "SELECT name FROM sysdatabases LIMIT 5";

using (var reader = cmd.ExecuteReader())
{
Console.WriteLine("\n现有数据库列表 (sysdatabases.name):");
while (reader.Read())
{
Console.WriteLine($" 数据库: {reader["name"]}");
}
}
}
}
catch (Exception ex1)
{
Console.WriteLine($"查询 sysdatabases 失败: {ex1.Message}");
}

// 方法2:查询 systables
try
{
using (var cmd = connection.CreateCommand())
{
cmd.CommandText = "SELECT tabname FROM systables WHERE tabid > 99 LIMIT 5";

using (var reader = cmd.ExecuteReader())
{
Console.WriteLine("\n系统表列表:");
while (reader.Read())
{
Console.WriteLine($" 表: {reader["tabname"]}");
}
}
}
}
catch (Exception ex2)
{
Console.WriteLine($"查询 systables 失败: {ex2.Message}");
}

// 方法3:查询 sysusers
try
{
using (var cmd = connection.CreateCommand())
{
cmd.CommandText = "SELECT username, usertype FROM sysusers WHERE username = ?";
cmd.Parameters.Add(new OdbcParameter("username", user));

using (var reader = cmd.ExecuteReader())
{
if (reader.Read())
{
Console.WriteLine($"\n用户 {user} 信息:");
Console.WriteLine($" 用户类型: {reader["usertype"]}");
}
else
{
Console.WriteLine($"\n未找到用户 {user}");
}
}
}
}
catch (Exception ex3)
{
Console.WriteLine($"查询 sysusers 失败: {ex3.Message}");
}

// 方法4:尝试创建数据库的语法测试
Console.WriteLine("\n=== 测试创建数据库权限 ===");
try
{
using (var cmd = connection.CreateCommand())
{
// 先尝试一个简单的查询来测试权限
cmd.CommandText = "SELECT CURRENT_USER, CURRENT_DATABASE";

using (var reader = cmd.ExecuteReader())
{
if (reader.Read())
{
Console.WriteLine($"当前用户: {reader[0]}");
Console.WriteLine($"当前数据库: {reader[1]}");
}
}
}
}
catch (Exception ex4)
{
Console.WriteLine($"权限测试失败: {ex4.Message}");
}


Console.WriteLine($"开始创建数据库: {databaseName}");

// 尝试不同的创建数据库语法
string[] createCommands = new string[]
{
// 方法1:标准语法
$"CREATE DATABASE {databaseName}",

// 方法2:带日志的数据库
$"CREATE DATABASE {databaseName} WITH LOG",

// 方法3:指定日志模式
$"CREATE DATABASE {databaseName} WITH BUFFERED LOG",

// 方法4:完整语法
$"CREATE DATABASE {databaseName} IN DBSPACE1 WITH BUFFERED LOG",

// 方法5:更详细的语法
$"CREATE DATABASE {databaseName} IN DBSPACE1 WITH LOG MODE ANSI"
};
for (int i = 0; i < createCommands.Length; i++)
{
try
{
Console.WriteLine($"\n尝试方法 {i + 1}: {createCommands[i]}");

using (var command = connection.CreateCommand())
{
command.CommandText = createCommands[i];
command.ExecuteNonQuery();

Console.WriteLine($"✓ 成功创建数据库 {databaseName}");

// 验证数据库是否创建成功
if (CheckGBaseDatabaseExists(ip, port, user, password, databaseName))
{
Console.WriteLine($"✓ 验证: 数据库 {databaseName} 创建成功");
return true;
}
else
{
Console.WriteLine($"⚠ 警告: 数据库创建命令执行成功,但验证时未找到数据库");
}
}
}
catch (Exception ex)
{
Console.WriteLine($"方法 {i + 1} 失败: {ex.Message}");
}
}
}
}
catch (Exception ex)
{
Console.WriteLine($"测试失败: {ex.Message}");
return false;
}
return true;
}

开始初始化 GBase 数据库: test11
? 连接成功

=== 测试系统表查询 ===

现有数据库列表 (sysdatabases.name):
数据库: sysmaster
数据库: sys
数据库: gbasedbt
数据库: sysutils
数据库: sysuser

系统表列表:
表: GL_COLLATE
表: GL_CTYPE
表: VERSION
表: sysdomains
表: sysindexes

用户 gbasedbt 信息:
用户类型: D

=== 测试创建数据库权限 ===
权限测试失败: ERROR [42000] [GBasedbt][GBasedbt ODBC Driver][GBasedbt]A syntax error has occurred.
开始创建数据库: test11

尝试方法 1: CREATE DATABASE test11
方法 1 失败: ERROR [HY000] [GBasedbt][GBasedbt ODBC Driver]General error.

尝试方法 2: CREATE DATABASE test11 WITH LOG
方法 2 失败: ERROR [HY000] [GBasedbt][GBasedbt ODBC Driver]General error.

尝试方法 3: CREATE DATABASE test11 WITH BUFFERED LOG
方法 3 失败: ERROR [HY000] [GBasedbt][GBasedbt ODBC Driver]General error.

尝试方法 4: CREATE DATABASE test11 IN DBSPACE1 WITH BUFFERED LOG
方法 4 失败: ERROR [HY000] [GBasedbt][GBasedbt ODBC Driver]General error.

尝试方法 5: CREATE DATABASE test11 IN DBSPACE1 WITH LOG MODE ANSI
方法 5 失败: ERROR [HY000] [GBasedbt][GBasedbt ODBC Driver]General error.
用户头像
GBase用户28017发表于 7个月前
我们还没用。
用户头像
GBase用户28017发表于 7个月前
学习。
枫溪发表于 7个月前
1
枫溪发表于 7个月前
2
枫溪发表于 7个月前
3
枫溪发表于 7个月前
4
枫溪发表于 7个月前
5
用户头像
路路路发表于 4个月前
解决了吗
用户头像
mittens发表于 4个月前
学习了
用户头像
mittens发表于 4个月前
学习了
用户头像
mittens发表于 4个月前
学习了
用户头像
mittens发表于 4个月前
学习了
用户头像
mittens发表于 4个月前
学习了
GBase用户51935发表于 2个月前
好问题啊。