我正在尝试将制表符分隔的文本文件上传到Access数据库。我有以下代码:
Let connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\...\testdb.accdb;Security Info=False;"
let connection = new OleDb.OleDbConnection(connectionString)
connection.Open()
let query = "SELECT * INTO [temp] FROM [Text;DATABASE=C\...].[name.txt]"
let command = new OleDb.OleDbCommand(query,connection)
command.Connection.Open()
command.ExecuteNonQuery()
此代码工作正常,但如何在MS Access中分离数据,以便它不是全部放入一列?
此外,是否有办法获取从MS Access中生成的数据或表格导入查询字符串,以便我可以在F#中使用它并在F#中使用它。
答案 0 :(得分:2)
嘿,我已经使用了一个schema.ini文件,正如@Remou建议的那样。
这些是我经历的步骤:
1)创建一个名为" testdb.accdb"的访问数据库。在目录" C:\ AccessDatabaseTest \"
中2)创建一个名为" TestData.txt"的标签分隔文件。在目录" C:\ AccessDatabaseTest \"具有以下内容:
ID TestColA TestColB
1 9 TestA
2 10 TestB
3 11 TestC
3)创建一个名为" schema.ini"的文件。在目录" C:\ AccessDatabaseTest \"具有以下内容:
[TestData.txt]
Format=TabDelimited
4)运行以下F#脚本文件:
#r "System.Data"
open System.Data.OleDb
let loadData() =
let connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='C:\AccessDatabaseTest\testdb.accdb';Persist Security Info=False;"
use connection = new OleDbConnection(connectionString)
connection.Open()
let query = "SELECT * INTO TestTable FROM [Text;HDR=YES;DATABASE=C:\AccessDatabaseTest].[TestData.txt]"
use command = new OleDbCommand(query,connection)
command.ExecuteNonQuery()
loadData()
出于某种原因,使用显式使用TabDelimited属性的命令
"SELECT * INTO TestTable FROM [Text;FMT=TabDelimited;HDR=YES;DATABASE=C:\AccessDatabaseTest].[TestData.txt]"
如果未使用schema.ini文件,则不起作用
你也可能已经注意到我使用的连接字符串略有不同,因为它有"坚持安全信息"而不只是"安全信息"并且F#脚本对暴露IDisposable接口的对象使用绑定,因此当它超出范围时会自动处理掉。有关详细信息,请参阅here。
修改强>
此版本在没有schema.ini文件的情况下运行。它基本上使用开源库F# Data将制表符分隔文件转换为csv文件,然后加载csv文件。您可以通过在Visual Studio中使用NuGet package manager下载来手动获取它。
#r "System.Data"
#r "../packages/FSharp.Data.2.0.3/lib/net40/FSharp.Data.dll"
open System.Data.OleDb
open FSharp.Data
let loadDataNoSchemaIni() =
let connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='C:\AccessDatabaseTest\testdb.accdb';Persist Security Info=False;"
// Load tsv file and save to a csv file using F# Data Csv Parser API
CsvFile.Load(@"C:\AccessDatabaseTest\TestData.txt","\t",'"',true)
.Save(@"C:\AccessDatabaseTest\TestData.csv",',','"')
use connection = new OleDbConnection(connectionString)
connection.Open()
let query = "SELECT * INTO TestTable FROM [Text;HDR=YES;DATABASE=C:\AccessDatabaseTest].[TestData.csv]"
use command = new OleDbCommand(query,connection)
command.ExecuteNonQuery()
loadDataNoSchemaIni()