Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2012中的文件流将创建一个空文件,而不是使用现有文件_Sql Server_Filestream - Fatal编程技术网

Sql server SQL Server 2012中的文件流将创建一个空文件,而不是使用现有文件

Sql server SQL Server 2012中的文件流将创建一个空文件,而不是使用现有文件,sql-server,filestream,Sql Server,Filestream,我在客户的服务器上遇到一个奇怪的问题。不幸的是,无法在他们的环境中进行调试,并且在发送相同消息时,我无法在服务器上重新创建问题。基本上,他们安装了两个程序:1)一个windows服务,用于检查电子邮件帐户中的消息;2)一个Web服务,在收到新消息时由windows服务调用 windows服务使用下面的代码(方法SaveToFileTable)使用filestreaming将文件保存在SQL Server中。保存文件后,它使用文件的主键调用webservice,webservice读取文件内容并对

我在客户的服务器上遇到一个奇怪的问题。不幸的是,无法在他们的环境中进行调试,并且在发送相同消息时,我无法在服务器上重新创建问题。基本上,他们安装了两个程序:1)一个windows服务,用于检查电子邮件帐户中的消息;2)一个Web服务,在收到新消息时由windows服务调用

windows服务使用下面的代码(方法SaveToFileTable)使用filestreaming将文件保存在SQL Server中。保存文件后,它使用文件的主键调用webservice,webservice读取文件内容并对其进行处理

问题

但是,当我检查文件目录时,实际上创建了两个文件。首先是包含内容的正确文件,然后是空文件。market服务器读取空文件并抛出异常

问题

为什么文件流创建2个文件?根据下面的代码,首先创建一个空文件。然后给它一个UNC路径来获取这个空文件并写入它。是否有两个文件句柄

其他信息

该客户正在使用SQL Server 2012,其上有两个实例。一个用于生产,一个用于测试

private long SaveToFileTable(string fileContent)
    {
        using (SqlConnection con = new SqlConnection(m_constr))
        {
            con.Open();

            using (SqlTransaction trn = con.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
            {
                StringBuilder sql = new StringBuilder();
                sql.AppendLine("insert into Company.FileTable (FileData)");
                sql.AppendLine("output inserted.FileIdentification, inserted.FileData.PathName() as Path, GET_FILESTREAM_TRANSACTION_CONTEXT() As TransactionContext");
                sql.AppendLine("values(0x)"); //Empty binary value

                byte[] fileData = System.Text.Encoding.UTF8.GetBytes(fileContent);

                SqlCommand cmd = new SqlCommand(sql.ToString(),con, trn);

                string path = null;
                long fileId = 0;
                byte[] context = null;

                // cmd is an INSERT command that uses the OUTPUT clause
                // Thus we use the ExecuteReader to get the
                // result set from the output columns
                using (SqlDataReader rdr = cmd.ExecuteReader())
                {
                    rdr.Read();
                    fileId = rdr.GetInt64(0);
                    path = rdr.GetString(1);
                    context = rdr.GetSqlBytes(2).Buffer;
                }

                using (SqlFileStream sfs = new SqlFileStream(path, context, FileAccess.Write, FileOptions.SequentialScan, 0))
                {
                    sfs.Write(fileData, 0, fileData.Length);
                    //file.InputStream.CopyTo(sfs);
                }
                trn.Commit();

                return fileId;
            }
        }
    }

注意,我没有看到回滚,但是我可以想象一个失败的插入仍然返回一个fileId。sfs.Write应该处于try/catch状态。他们有一个测试数据库;你能在那里进行调试吗?你找到这个问题的原因了吗?请在SQL2014上更新我们。此处相同,但不确定这是否是一个问题,因为我们不尝试从文件系统读取文件。