在BULK INSERT期间,新创建的CSV文件出错

时间:2016-12-03 06:36:56

标签: sql sql-server tsql csv vb.net-2010

我想请求你的帮助。

我创建了一个程序,它将从CSV文件中检索数据,读取所选行,然后使用所选数据创建CSV文件。之后,系统会将数据从新创建的文件上传到数据库,从而结束交易。

问题是在执行BULK INSERT时,数据库抛出并发生错误

operating system error code 5(failed to retrieve text for this error. reason: 15105)

经过研究,我发现这是一个许可问题,或者是吗?

这是我到目前为止所做的。

ALTER DATABASE training SET TRUSTWORTHY ON

我还在我的BULK INSERT

上添加了FIRE_TRIGGERS

注意我正在使用SA帐户,我想将其上传到我的本地数据库(部署将在我们的实时服务器上)

请注意,不要使用我创建的存储过程从SQL插入数据。

任何建议都表示赞赏。

提前致谢!

1 个答案:

答案 0 :(得分:0)

所以这个错误确实是一个权限错误,正如@sandeep rawat所说的那样,你可以使用他的答案。如果您想在系统中执行此操作,我想与您分享我的所作所为。

首先,我想对一些在回答这个问题时可能非常关键和必要的缺点表示道歉。 1)我忘了提到,系统是在我的计算机中创建并保存的,该计算机有域和管理员,我的用户帐户需要管理员权限才能更改任何内容。(因此,这是一个权限错误)

2)我创建的存储过程在我尝试从我的用户帐户中加载数据时不起作用。我尝试使用以下代码存储过程

BULK INSERT temptable
    FROM 'C:\Users\MyUser\Documents\Visual Studio 2010\Projects\TestUploader\TestUploader\bin\Debug\MyCSV.csv'
    WITH
    (
    FIELDTERMINATOR = '','',  
    ROWTERMINATOR = ''\n'',
    MAXERRORS = 100,
    FIRSTROW = 2
    )

它没有用,它给出了问题中陈述的错误。

所以这就是我所做的。

1)我导入了system.security.accessControl

Imports System.Security.AccessControl

2)我在C:\

下创建了一个文件夹
Dim folderName As String
folderName = "C:\CSVUPLOADS\"

'check if folder exists, if not, create folder
           If (Not System.IO.Directory.Exists(folderName)) Then
               System.IO.Directory.CreateDirectory(folderName)
           End If

3)授予对文件夹

的访问权限
 Dim FolderInfo As IO.DirectoryInfo = New IO.DirectoryInfo(folderName)
                Dim FolderAcl As New DirectorySecurity
                FolderAcl.AddAccessRule(New FileSystemAccessRule(UserAccount, FileSystemRights.Modify, InheritanceFlags.ContainerInherit Or InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow))
                FolderInfo.SetAccessControl(FolderAcl)

4)然后我从原始位置重新创建了文件,并将其放在新文件夹中。

 fileName = "dataUpload.csv"
fileName = folderName & fileName

'Create CSV file
                File.Create(fileName).Dispose()

在我上面创建的步骤之后,我现在可以读取CSV文件,即使在部署环境中也是如此。

这些步骤的优点是,您不必为某些文件夹添加权限。

缺点是,我必须创建一个系统来创建,复制和定位我需要的CSV文件到另一个位置。

请注意我为此创建了一个系统,而不仅仅是一个SQL脚本,因此上面的代码不完整。上面的代码仅讨论了创建新文件夹和新的CSV文件,这些文件可以由SQL读取,而无需手动为其授予权限。因此,如果您选择这样做,则必须研究如何将CSV文件中的数据提供给新的CSV文件,调用存储过程,然后进行批量插入。

P.S - 我没有将此标记为答案,但仅作为选项,因为真正的答案是权限。