- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 SQL Server 数据库和 JDBC 以及带有 sqljdbc42.jar
驱动程序的池。
代码:
library(DBI)
library(RJDBC)
library(pool)
jar.path.ms.sql.driver <- "./www/base/sql_drivers/sqljdbc42.jar"
jdbc.sql.driver <- JDBC(
driverClass = "com.microsoft.sqlserver.jdbc.SQLServerDriver",
classPath = jar.path.ms.sql.driver
)
sql.url <- "jdbc:sqlserver://sql01" # our server url
sql.dname <- "my_projects"
sql.username <- "user"
sql.password <- "password"
pool <- dbPool(
drv = jdbc.sql.driver,
url = sql.url,
dname = sql.dname,
username = sql.username,
password = sql.password
)
到目前为止,还不错。我可以使用 dbReadTable
从数据库中读取表格。我还可以使用 dbWriteTable
将表写入数据库。对于写入案例,我在数据框中有要用很长的字符串写入的列。在某些情况下,字符串的长度超过 255 个字符。
我曾希望使用 dbWriteTable
函数的 field.types
参数来正确配置 SQL Server 列(comments
是我的数据框架写入数据库):
conn <- poolCheckout(pool)
DBI::dbWriteTable(conn = conn,
DBI::Id(cluster = "my_projects", schema = "dbo", table = "comments"),
value = comments,
overwrite = TRUE,
row.names = FALSE,
field.types = c(
STRATEGIC_AREA = "varchar(255)",
OBJECTIVE = "varchar(255)",
METHOD_OF_MEASURE = "varchar(MAX)",
TARGET = "float",
UNIT = "varchar(255)",
MIN_MAX = "varchar(255)",
JUL = "varchar(1024)",
AUG = "varchar(MAX)",
SEP = "varchar(MAX)",
OCT = "varchar(MAX)",
NOV = "varchar(MAX)",
DEC = "varchar(MAX)",
JAN = "varchar(MAX)",
FEB = "varchar(MAX)",
MAR = "varchar(MAX)",
APR = "varchar(MAX)",
MAY = "varchar(MAX)",
JUN = "varchar(MAX)"
))
poolReturn(conn)
poolClose(pool)
问题是 SQL Server 数据库忽略了列类,并与 varchar(255)
列一致地创建。 field.types
中的 varchar(1024)
或 varchar(MAX)
等列类将被忽略。该函数似乎遵循数据框列类的映射:
如果我将 DBI::Id(cluster = "my_projects", schema = "dbo", table = "comments")
替换为 "my_projects. dbo.comments”
。如果我引用传递给 field.types
的命名字符向量的左侧也没有关系。
结果,包含长度超过 255 个字符的字符串的数据框行被截断(这些行被跳过),与数据框相比,我最终在 SQL Server 表中得到的行数更少。错误消息(非常长的字符串位于 FEB
列中):
Error in .local(conn, statement, ...) :
execute JDBC update query failed in dbSendUpdate (String or binary data would be truncated in table 'my_projects.dbo.comments', column 'FEB'. Truncated value:
我错过了什么?
更新
根据下面sgoley的更新,我将代码更改如下:
dbCreateTable(
conn = conn,
Id(
database = "my_projects",
schema = "dbo",
table = "comments"
),
fields = c(
STRATEGIC_AREA = "varchar(255)",
OBJECTIVE = "varchar(255)",
METHOD_OF_MEASURE = "varchar(255)",
TARGET = "float",
UNIT = "varchar(255)",
MIN_MAX = "varchar(255)",
JUL = "varchar(MAX)",
AUG = "varchar(MAX)",
SEP = "varchar(MAX)",
OCT = "varchar(MAX)",
NOV = "varchar(MAX)",
DEC = "varchar(MAX)",
JAN = "varchar(MAX)",
FEB = "varchar(MAX)",
MAR = "varchar(MAX)",
APR = "varchar(MAX)",
MAY = "varchar(MAX)",
JUN = "varchar(MAX)"
),
row.names = NULL
)
values <- DBI::sqlAppendTable(con = conn,
table = Id(database = "my_projects", schema = "dbo", table = "comments"),
values = comments,
row.names = FALSE)
RJDBC::dbSendUpdate(conn, values)
这现在可以正常工作,没有任何问题和错误消息。使用 Microsoft SQL Server Management Studio 进行的验证确认列现在是正确的类并遵循 fields
规范。
最佳答案
尝试构建尽可能完整的答案 - 让我们先从 RJDBC 项目开始
repo :https://github.com/s-u/RJDBC
在我看来,Simon 可能在这里用他的驱动程序级别类型映射无意中覆盖了所有显式字段类型声明?
我说这只是一个非常高层次的推测,因为当涉及到 R
、Java
和 DBI< 的交集时,我肯定超出了我的理解范围
但如果鞋子合脚呢?
当我运行类似的东西时:
> dbDataType(jdbc.sql.driver,titanic)
Class Sex Age Survived Freq
"TEXT" "TEXT" "TEXT" "TEXT" "DOUBLE"
驱动程序似乎将这些类型映射到 varchar(255)
,这就是为什么您会看到所有创建的列都默认设置为该类型。
无论如何。只是猜测原因,继续解决问题。
利用上述所有评论和建议,到目前为止,对我来说,在 sql server 中实现这些数据类型的最佳和唯一方法(无需通过 dbExecute
super 显式地执行它 你可以) 是:
pool <- dbPool(
drv = jdbc.sql.driver,
url = sql.url,
dname = sql.dname,
schema = sql.schema,
username = sql.username,
password = sql.password
)
conn <- poolCheckout(pool)
dbCreateTable(conn= conn,
Id(database = "my_project",
schema = "dbo",
table = "titanic"),
fields = c( Class="nvarchar(max)",
Sex="varchar(max)",
Age="ntext",
Survived="text",
Freq="integer"
),
row.names = NULL)
产生:
然后从那里开始,想法是插入带有类似内容的行:
dbAppendTable(conn= conn,
name= Id(database = "my_project", schema = "dbo", table = "titanic"),
value = titanic)
但是我遇到了以下错误:
Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set", :
Unable to retrieve JDBC result set
JDBC ERROR: The value is not set for the parameter number 2.
Statement: INSERT INTO "my_project"."dbo"."titanic"
("Class", "Sex", "Age", "Survived", "Freq")
VALUES
(?, ?, ?, ?, ?)
In addition: Warning message:
In if (is.na(v)) { :
the condition has length > 1 and only the first element will be used
所以现在更好的选择是使用:
values <- DBI::sqlAppendTable(con = conn, table = Id(database = "my_project", schema = "dbo", table = "titanic"), values = titanic)
DBI::dbExecute(conn = conn, values)
关于R DBI SQL Server : dbWriteTable truncates rows/field. 类型参数不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66864660/
我在我的应用程序中使用 JDBI 和 Dropwizard。我已经使用 dbi.open 命令获取了一个 DAO 实例,然后使用它来运行各种查询。在“finally” block 中,我使用 dao.
我有一个在 eval 中运行的数据库查询,以捕获错误。问题是错误消息正在输出到控制台,即使它被困住了。如何阻止错误消息执行此操作,因为我想自己解析它并吐回我自己的消息? my $dbh = DBI->
这是我使用 DBI 的示例代码: db = DBI.connect("DBI:Mysql:database=testdatabase;host=testhost;port=30012", "testu
使用: MySQL 5.5ActivePerl v5.14.1Windows 7 64 位 以下脚本在执行调用失败时有一个未定义的 $DBI::errstr: #!c:/perl/bin/perl.e
这是整个错误 SCREAM: Error suppression ignored for ( ! ) Fatal error: Maximum execution time of 30 seconds
在Perl中捕获任何DBI错误的最佳方法是什么?例如,如果由于插入的值中包含非法字符而导致插入失败,那么如何使脚本不失败,但是如何捕获错误并进行适当处理。 我不想做“死”,因为我不想停止脚本的执行。
在工作中,我们有一个 DBA,他说他的 RAC 工作得很好,但事实并非如此。像 Toad 或 SQL Developer 这样的 SQL IDE 会随机断开它们的连接(我怀疑是因为 RAC 的网络设置
所以我有这个非常简化的片段: @cmd_arry = ("Bob Newhart", "54"); $sqlCmd = "UPDATE foobar SET name = ?, age = ?"; $
除了使用标准代码模具“无法连接:$ DBI::errstr\n”来处理错误之外,是否可以编写如下的自定义代码? 标准: $dbstore = DBI->connect($dsn, $user, $pw
假设我正在查询一个类似于以下内容的表: $dbh->selectrow_hashref('SELECT id, name FROM foos WHERE name = "bar"'); 当然,id将是
我在长时间运行的 perl 脚本中遇到了一些内存泄漏问题,其中 perl 占用的内存量继续增长。因此,我尝试使用 Devel::Leak追踪泄漏。我发现每当我调用 DBI的prepare方法,Deve
我想从表中复制一条记录,修改记录中的一些字段并插入到同一个表中。该表有 90 列。 考虑在一个语句中使用 insert..select 但有 90 列,我需要在选择查询中告诉列名。我怎样才能在 per
我有这个查询 select * from table where ID in (1,2,3,5...) 如何使用占位符使用 DBI 构建此查询? 例如 : my @list = (1, 2, 3, 4
如何使用 perl 和 fbi 针对 sql server 检索存储过程的返回值?有人可以举个例子吗? 最佳答案 DBD::ODBC t/dir 中有示例(参见 20SqlServer.t)。基本上你
实际上我已经执行了postgres查询,假设它返回了10行。现在我有了语句处理程序( $sth )。 print Dumper $sth->fetchrow_arrayref; print Dumpe
我想让 perl 在我自己的路径中使用 DBI 模块(假设,/home/users/zdd/perl5/lib/DBI),但是系统也有一个 DBI 模块,它是/usr/lib/perl5/库/DBI。
实际上我已经执行了postgres查询,假设它返回了10行。现在我有了语句处理程序( $sth )。 print Dumper $sth->fetchrow_arrayref; print Dumpe
我不熟悉在 perl 脚本中使用 DBI 进行 SQL 查询。我遇到的问题与具有正斜杠的字段中的数据有关。我想使用变量作为 where 子句的输入,但它正在做 DBI 打算用正斜杠做的事情:停止查询。
假设我有一个连接到数据库的子例程。然后我想进行查询并接收输出并对其进行处理,当然,但是如果查询无效怎么办? 所以让我们假设我有类似的东西: $dbh = DBI->connect(, , ); $qu
我正在使用 Perl 的 DBI 进行 postgreSQL 访问,我注意到当我有多个并发进程准备同一个查询时,它们似乎在服务器上以相同的准备语句名称结束,从而产生了冲突。 2014-02-10 10
我是一名优秀的程序员,十分优秀!