我在 Windows 7(版本6.1 Build 7601:Service Pack 1)和visual studio 2010上安装了SQL server express 2008 SP1.
我正在尝试使用以下代码创建一个存储过程CLR,用于将文件插入到文件流中.
using System; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; using System.IO; using System.Security.Principal; public partial class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static void sp_fileController(String friendlyName, String filePath) { SqlParameter fDataParam = new System.Data.SqlClient.SqlParameter("@fData", SqlDbType.VarBinary, -1); SqlParameter fNameParam = new System.Data.SqlClient.SqlParameter("@fName", SqlDbType.NVarChar, 300); WindowsIdentity newId = SqlContext.WindowsIdentity; WindowsImpersonationContext impersonatedUser = newId.Impersonate(); try { string cs = @"Server=[myservername];Integrated Security=true"; using (SqlConnection con = new SqlConnection(cs)) { con.Open(); SqlTransaction objSqlTran = con.BeginTransaction(); //string sql = "INSERT INTO fileStreamTest VALUES ((Cast('' As varbinary(Max))), @fName, default); Select fData.PathName() As Path From fileStreamTest Where fId = SCOPE_IDENTITY()";//OUTPUT inserted.fid SqlCommand insertFileCommand = con.CreateCommand(); insertFileCommand.Transaction = objSqlTran; insertFileCommand.CommandText = "INSERT INTO fileStreamTest.dbo.fileStreamTest (RowGuid, fData) VALUES (@FileID, CAST ('' as varbinary(max)))"; Guid newFileID = Guid.NewGuid(); insertFileCommand.Parameters.Add("@FileID", SqlDbType.UniqueIdentifier).Value = newFileID; insertFileCommand.ExecuteNonQuery(); SqlCommand getPathAndTokenCommand = con.CreateCommand(); getPathAndTokenCommand.Transaction = objSqlTran; getPathAndTokenCommand.CommandText = "SELECT fData.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() " + "FROM fileStreamTest.dbo.fileStreamTest " + "WHERE rowGuid = @FileID"; getPathAndTokenCommand.Parameters.Add("@FileID", SqlDbType.UniqueIdentifier).Value = newFileID; SqlDataReader tokenReader = getPathAndTokenCommand.ExecuteReader(CommandBehavior.SingleRow); tokenReader.Read(); SqlString filePathName = tokenReader.GetSqlString(0); SqlBinary fileToken = tokenReader.GetSqlBinary(1); tokenReader.Close(); SqlFileStream sqlFile = new SqlFileStream(filePathName.Value, fileToken.Value, System.IO.FileAccess.ReadWrite); sqlFile.Close(); objSqlTran.Rollback(); //objSqlTran.Commit(); con.Close(); } } finally { impersonatedUser.Undo(); } } };
但是,当它到达该行:
SqlFileStream sqlFile = new SqlFileStream(filePathName.Value, fileToken.Value, System.IO.FileAccess.ReadWrite);
我明白了:
执行用户定义的例程或聚合“sp_fileController”期间发生.NET Framework错误:
System.ComponentModel.Win32Exception: The request is not supported System.ComponentModel.Win32Exception: at System.Data.SqlTypes.SqlFileStream.OpenSqlFileStream(String path, Byte[] transactionContext, FileAccess access, FileOptions options, Int64 allocationSize) at System.Data.SqlTypes.SqlFileStream..ctor(String path, Byte[] transactionContext, FileAccess access, FileOptions options, Int64 allocationSize) at System.Data.SqlTypes.SqlFileStream..ctor(String path, Byte[] transactionContext, FileAccess access) at StoredProcedures.sp_fileController(String friendlyName, String filePath)
谁能告诉我如何解决这个问题?只是我不能用sql 2008 Express版本以这种方式执行代码?
我想我在这里找到了有效的解决方案:https://social.msdn.microsoft.com/Forums/sqlserver/en-US/f49def09-3b47-4e54-8a53-2dd47762821e/filestream-on-windows-server-2012-the-request-is-not-supported?forum=sqldatabaseengine
总结:添加注册表项解决了SQL Server 11.0.7001上的问题:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\FsctlAllowlist] "FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT"=dword:0x00092560
查看更多关于c# – sqlFileStream System.ComponentModel.Win32Exce的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did69382