c# – sqlFileStream System.ComponentModel.Win32Exception:不
发布时间:2020-12-15 21:23:50 所属栏目:百科 来源:网络整理
导读:我在 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
我在
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,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,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_MACHINESYSTEMCurrentControlSetServicesLanmanServerParametersFsctlAllowlist] "FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT"=dword:0x00092560 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |