我正在使用.NET的RedShift ODBC驱动程序将行插入RedShift数据库表。
该表格包含一个名为' email'并定义为VARCHAR(MAX) 在插入具有非标准字符的行(例如,3/4字符或带有重音符号的法语e)之前,所有行都被插入而没有问题。此时我收到以下错误:
"字符串数据右截断来自数据源的数据:字符串数据对于驱动程序的数据缓冲区来说太大了。"
这是连接字符串(使用string.Format替换一些信息):
Driver={{Amazon Redshift (x64)}};Server={0};Database={1};UID={2};PWD={3};Port={4};SSL=true;Sslmode=Require;MaxVarchar=1000;UseUnicode=1"
我添加了最后两个参数,以查看它们是否有用,但没有它们也无法正常工作。
附加信息:当我使用像" Aginity"这样的客户端程序插入行时,行被插入属性,这使我相信问题不在表定义中。
以下是在客户端程序中有效的插入内容(该电子邮件故意不是合法的电子邮件):
insert into summary.member values ('59D6687E-078F-45EA-8736-9A08AA85AD4D', 'shrew8@gmail¾comdde')
以下是表格定义:
CREATE TABLE summary.member ( member_id VARCHAR(255)DISTKEY, member_email VARCHAR(255) ) SORTKEY ( 会员ID, MEMBER_EMAIL );
以下是打开连接的代码:
private static OdbcConnection CreateAndOpenOdbcConnection() { const string server =" someserverinfo.redshift.amazonaws.com&#34 ;; const string port =" 5439&#34 ;; const string masterUsername =" myusername&#34 ;; const string masterUserPassword =" mypassword&#34 ;; const string dbName =" databasename&#34 ;;
var connectionString =
string.Format(
"Driver={{Amazon Redshift (x64)}};Server={0};Database={1};UID={2};PWD={3};Port={4};SSL=true;Sslmode=Require;MaxVarchar=1000;UseUnicode=1",
server, dbName, masterUsername, masterUserPassword, port);
var odbcConnection = new OdbcConnection(connectionString);
odbcConnection.Open();
return odbcConnection;
}
以下是执行插入的代码:
private int InsertMember(Guid column1data, string column2data) { var command = new OdbcCommand(string.Format("INSERT INTO database.table (column1, column2, column3) values(?, ?, ?)"), Connection); command.Parameters.AddWithValue("@column1", column1data.ToString()); command.Parameters.AddWithValue("@column2", column2data); command.Parameters.AddWithValue("@column3", "column3data"); return command.ExecuteNonQuery(); }
答案 0 :(得分:2)
此问题的解决方法是使用PostgreSQL UNICODE驱动程序而不是RedShift驱动程序。似乎RedShift驱动程序中可能存在导致此行为的错误。我已通知AWS支持,他们正在研究它。
答案 1 :(得分:1)
亚马逊已发布其ODBC驱动程序的更新以解决此问题: http://docs.aws.amazon.com/redshift/latest/mgmt/install-odbc-driver-windows.html