3

私は次のようなsqlSaveマトリックスを追加するために戦っています:B

Noinscr
88877799
45645687
23523521
45454545

SQLテーブルに。

したがって、次のコマンドを実行します。

sqlSave(channel, b, "[testsFelix].[dbo].[TREB]", append = TRUE,
  rownames = FALSE, colnames = FALSE, safer = TRUE, fast = FALSE)

次のエラーが発生します。

Erreur dans sqlSave(channel, b, "[testsFelix].[dbo].[TREB]", append = TRUE,  : 
  42S01 2714 [Microsoft][SQL Server Native Client 10.0][SQL Server]
    There is already an object named 'TREB' in the database.
  [RODBC] ERROR: Could not SQLExecDirect
    'CREATE TABLE [testsFelix].[dbo].[TREB]  ("Noinscr" int)'

テーブルが消去されたくなかったので、たとえappend=TRUEそこにあったとしても、SQLテーブルを消去して、同じコードを再度実行しようとしました。

次のエラーが発生します。

Erreur dans sqlColumns(channel, tablename) : 
  ‘[testsFelix].[dbo].[TREB]’: table not found on channel

だから私は混乱しています。Rを追加したいときは、テーブルが存在するためにできないと言い、テーブルが存在しないときは、テーブルが存在しないために情報を入れることができないと言います。SQLにアクセスして何も起こらなかったことを確認しましたが、Rが正しい列名(Noinscr)でテーブルを作成したのに、テーブルが空であることがわかりました。

私が間違っていることを教えてください。ありがとうございました

4

6 に答える 6

3

私も同じ問題を抱えていました。私が気付いたのは、デフォルトでsqlSaveが「マスター」スキーマにテーブルを作成するということです。ODBCデータソースアドミニストレータを起動し、デフォルトのデータベースを変更して目的のデータベースを選択すると、機能しました。

于 2014-08-21T12:08:41.020 に答える
2

私はこの投稿が同様の問題でグーグルしているのを見つけました。R再起動後もシステムを再起動しても、問題は解決しませんでした。のデータベースへの新しい接続を開き、を使用してそれに書き込むことにより、問題をデータベースに絞り込みましたsqlSave

奇妙なことに、元のデータベースの問題は、次を使用してデータベースを開いたり閉じたりすることで修正されましたR

DBchannel <- odbcConnectAccess(access.file = "C:/myPath/Data.mdb")
odbcClose(DBchannel)

これを行った後、次のテストは問題なく機能しました。

require(RODBC)
dd <- data.frame('normal' = rnorm(100), 'uniform' = runif(100))
DBchannel <- odbcConnectAccess(access.file = "C:/myPath/Data.mdb")
sqlSave(DBchan, dd, tablename='testtable')
odbcClose(DBchannel)

(私の最初の(非)解決策はデータベースを再構築することだったので、これは素晴らしいことです)

于 2013-01-07T05:04:56.417 に答える
0

私はあなたと同じ問題に苦しんでいます。odbcQueryを呼び出して、データを1行ずつ挿入できます。ただし、私のdata.frameには数十ミリオンの行があります。インサートでオスローするようなものです。データセットが大きくない場合は、試してみてください。

于 2011-11-21T21:28:54.957 に答える
0

問題は、データベースを省略してtablenameパラメータ "[testsFelix].[dbo].[TREB]"を記述しなければならないときと 同じようにパラメータを記述したことです。 "[dbo].[TREB]"

odbcチャネルのデータベースを目的のデータベースに変更する必要があります。Microsoftのodbc管理者。おそらく問題は、デフォルトのデータベースが[testsFelix]

したがって、私があなたの問題に対して持っていた解決策は

  1. odbc管理者を介して、Microsoftでチャネルのデータベースを[testsFelix]に変更します

  2. tablenamesqlSaveのパラメーターはデータベースを想定していないため、構文として記述する必要があり[schema].[tablename]ます

sqlSave(channel, b, "[dbo].[TREB]", append = TRUE,
  rownames = FALSE, colnames = FALSE, safer = TRUE)

ところで。私の場合、1000個の観測値のブロックに値を挿入する方が高速です。

トリックを試してください:

vals = paste0("('", b$Field1   , "','",
                    b$Field2   , "','",
                    b$Field3   , "','",
                    b$lastField, "')", collapse = ",")


sqlQuery(channel, 
         query = paste0("INSERT INTO [testsFelix].[dbo].[TREB] 
                         values", vals), as.is = TRUE)


于 2022-02-17T13:49:57.817 に答える
-1

これを試してみてください

sqlSave(channel, b, "_b", append = TRUE,
    rownames = FALSE, colnames = FALSE, safer = TRUE, fast = FALSE)

私が見つけたのは、Excelがデフォルトのファイル名の前に「_」を追加することです。これをファイル名に追加すると、Excelはテーブルを見つけます。

于 2012-04-27T16:07:10.727 に答える
-1

角かっこ([])を削除する必要があります。そうすれば、正常に動作するはずです。

于 2016-09-15T15:05:12.530 に答える