.net framework 4.8 连接GBase数据库错误
为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【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;
}
评论
{
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.
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25044
- 42023-09-25浏览数:18519
- 52020-05-11浏览数:17526