我想请求你的帮助。
我创建了一个程序,它将从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插入数据。
任何建议都表示赞赏。
提前致谢!
答案 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 - 我没有将此标记为答案,但仅作为选项,因为真正的答案是权限。