Pergunta

Estou tentando usar o

OpenSqlFileStream

Instrução, mas meu código não reconheceu

Qual DLL eu tenho que carregar para usá -lo?


Caro Marc_s olha para o meu código

Public Sub WriteFileStream(ByVal imSource As Byte(), ByVal imSize As Integer, ByVal imTy As Type, ByVal sender As Object, ByVal e As EventArgs)
    Dim subProvider As String = Nothing
    Dim subDataSource As Object = Nothing
    Dim subUid As String = Nothing
    Dim subPwd As String = Nothing
    Dim subDataBase As String = Nothing
    Dim subPSI As Boolean = Nothing
    Dim ParamXML() As String = Nothing
    Dim TypeOfServer As String = "Remote"
    Dim imParam(3) As String
    Dim imTable(1) As String
    Dim RemoteSQLcmd As SqlCommand = New SqlCommand
    Dim tokenReader As SqlDataReader
    '-------------------------------------------------'

    Dim AbsRecord As Int64 = 0
    Dim VarString(10) As String
    Dim VarInt(10) As Integer
    '-------------------------------------------------'
    ParamXML = Split(loadXmlFile(TypeOfServer, sender, e), "|")
    subUid = ParamXML(3)
    subProvider = ParamXML(0)
    subDataSource = ParamXML(1)
    subDataBase = ParamXML(2)
    subPwd = ParamXML(4)
    subPSI = ParamXML(5)

    Dim SchemaID As String = Convert.ToInt16(ParamXML(8))
    Dim SchemaName As String = Nothing
    If SchemaID = 1 Then
        SchemaName = subUid
    ElseIf SchemaID = 2 Then
        SchemaName = "dbo"
    ElseIf SchemaID = 0 Then
        SchemaName = "dbo"
    End If
    '-------------------------------------------------'
    imTable(0) = "tPDetails"
    imTable(1) = "tPImages"
    Try
        imParam(0) = Me.TextBox1.Text.Trim.ToString     'Name'
        imParam(1) = Me.TextBox2.Text.Trim.ToString     'Code'
        imParam(2) = Me.TextBox3.Text.Trim.ToString     'Price'
        imParam(3) = Me.TextBox4.Text.Trim.ToString     'Comments'
        '========================================================'
    If RemoteSQLConn.State = ConnectionState.Open Then RemoteSQLConn.Close()
    SQL_Connection(TypeOfServer, TypeOfServer & "Conn.xml", sender, e)
    RemoteSQLConn.open()

        '----------------------'
        Dim imHolder As Image = Image.FromStream(imStream)
        Dim imHeight As Integer = imHolder.Height
        Dim imWidth As Integer = imHolder.Width
        Dim imLength As Integer = imHolder.PropertyItems.Length
        Dim imType As Type = imTy
        '----------------------'
        Dim FirstColumnNames As String = _
                                imTable(0) & "_Code, " & _
                                imTable(0) & "_Price, " & _
                                imTable(0) & "_Title, " & _
                                imTable(0) & "_Type, " & _
                                imTable(0) & "_Height, " & _
                                imTable(0) & "_Width, " & _
                                imTable(0) & "_Stock, " & _
                                imTable(0) & "_Comments "
        Dim FirstFieldsValues As String = "'" & imParam(1) & "', '" & _
                                imParam(2) & "', '" & _
                                imParam(0) & "', '" & _
                                imType.ToString & "', '" & _
                                imHeight & "', '" & _
                                imWidth & "', '" & _
                                "0', '" & _
                                imParam(3) & "' "
'--------------------------------------------'
           RemoteSQLcmd = New SqlCommand("INSERT INTO " & _
    SchemaName & "." & imTable(0) & " (" & FirstColumnNames & ")                     VALUES (" & FirstFieldsValues & ") ", RemoteSQLConn)
            RemoteSQLcmd.ExecuteNonQuery()
            '--------------------------------------------------'
    RemoteSQLcmd = New SqlCommand("SELECT * FROM " & SchemaName & "." & imTable(0) & _
    " WHERE " & imTable(0) & "_Code = " & "'" & imParam(1) & "'", RemoteSQLConn)
            AbsRecord = RemoteSQLcmd.ExecuteScalar
            '--------------------------------------------------'
      RemoteSQLcmd = New SqlCommand("INSERT INTO " & SchemaName & "." & imTable(1) & " VALUES (newid(), " & AbsRecord & ", CAST('' as varbinary(max)))", RemoteSQLConn)

            RemoteSQLcmd.ExecuteNonQuery()
            '--------------------------------------------------'
    RemoteSQLcmd = New SqlCommand("SELECT " & imTable(1) & "_Image.PathName() FROM " & _
SchemaName & "." & imTable(1) & " WHERE " & imTable(1) & "_" & imTable(0) & "_ID = " & AbsRecord, RemoteSQLConn)
            Dim filePathName As String = Nothing
            Dim pathObj As Object = RemoteSQLcmd.ExecuteScalar()
'--------------------------------------------------   Path Name  '
            If Not pathObj.Equals(DBNull.Value) Then
                filePathName = DirectCast(pathObj, String)
            Else
    Throw New System.Exception("Image.PathName() failed to read the path name for the Image column.")
            End If
    '--------------------------   GET_FILESTREAM_TRANSACTION_CONTEXT()'
            Dim RemoteSQLtx As SqlTransaction = RemoteSQLConn.BeginTransaction("MainTranaction")
            RemoteSQLcmd.Transaction = RemoteSQLtx
    RemoteSQLcmd = New SqlCommand("SELECT GET_FILESTREAM_TRANSACTION_CONTEXT()", RemoteSQLConn, RemoteSQLtx)
            Dim tokenObject As Object = RemoteSQLcmd.ExecuteScalar()
        '--------------------------------------   File Token '
            tokenReader = RemoteSQLcmd.ExecuteReader(CommandBehavior.SingleRow)
            tokenReader.Read()
            Dim txContext As SqlBinary = DirectCast(tokenObject, Byte())
            tokenReader.Close()
            '-----------------------------------------------'
            Try
                '--------------------  Closing all connections'
       If RemoteSQLConn.State = ConnectionState.Open Then RemoteSQLConn.Close()
       If RemoteSQLcmd.Connection.State = ConnectionState.Open Then RemoteSQLcmd.Connection.Close()
                If RemoteConnInfo.State = ConnectionState.Open Then RemoteConnInfo.Close()
                RemoteSQLtx.Dispose() '.Connection.State = ConnectionState.Open Then RemoteSQLtx.Connection.Close()
       '--------------------  Open connections for Indegrated Security''
                ChangeLoginPerson("PRINCIDEVEL\Administrator")
                RemoteConnInfo.ConnectionString = "Provider=" & subProvider & "; Data Source=" & subDataSource & _
                "; Database=" & subDataBase & "; Integrated Security=" & "SSPI" & "; Persist Security Info=" & subPSI
                RemoteSQLcmd.Connection.Open()
                RemoteSQLConn = New SqlConnection("Server=" & subDataSource & "; Integrated Security=TRUE" & "; database=" & subDataBase)
                RemoteSQLConn.Open()
                RemoteSQLtx = RemoteSQLConn.BeginTransaction("MainTranaction")
                RemoteSQLcmd.Transaction = RemoteSQLtx
                '-------------------------  Write in to file stream   ---------------'
                Dim imImage As Byte() = New Byte(imStream.Length) {}
                Dim bytesRead As Integer = imStream.Read(imImage, 0, imStream.Length)
                Dim sqlFile As New SqlFileStream(filePathName, txContext, FileAccess.ReadWrite, FileOptions.WriteThrough, 0)
                Dim numBytes As Integer = 0
                Dim unicode As Encoding = Encoding.GetEncoding(0)
                While bytesRead > 0
                    sqlFile.Write(imImage, 0, bytesRead)
                    bytesRead = imStream.Read(imImage, 0, imSize)
                End While
                RemoteSQLtx.Commit()
                RemoteSQLcmd.Transaction.Commit()
                sqlFile.Close()
            Catch FsEx As Exception
                MessageBox.Show(FsEx.Message, "Write in SQL File Stream ", MessageBoxButtons.OK, MessageBoxIcon.Stop)
            Finally
            End Try
            '--------------------------------------------------'
        Catch ex As Exception
MessageBox.Show(ex.Message, "WriteFileStream ", MessageBoxButtons.OK, MessageBoxIcon.Stop)
            Finalize()
        Finally
            RemoteSQLConn.Close()
            imStream.Close()
        End Try


    End Sub
Foi útil?

Solução

Você faz todas as etapas necessárias antes de abrir o fluxo de arquivos? Agarrando o contexto dentro de uma transação ??

Veja isso artigo aqui Para uma discussão detalhada sobre como fazê -lo. Aqui está outro Postagem do blog com um snippet de código de amostra VB.NET.


Atualizar: Lefteris, seu snippet de código é muito difícil de ler e entender, eu fiz o meu melhor, mas realmente não tenho certeza. O que estou pensando é que você fecha a transação muito rapidamente. Você parece criar uma conexão e uma transação para obter o get_filestream_transaction_context, mas depois fecha isso novamente antes de realmente escrever seus bytes. Eu acho que a transação deve abranger todas as operações - ela deve iniciar antes de obter o contexto da transação e deve permanecer vivo para toda a operação de gravação e só será comprometido quando toda a operação de gravação for concluída.

Tentei criar um trecho de código mais simples para mostrar a você - está em C#, já que não consegui convertê -lo de volta para VB.NET:

public static void WriteFileStream(byte[] imSource, int imSize)
{ 
   // use your own SQL insert command here instead
   const string InsertCmd = "INSERT INTO PhotoAlbum(PhotoId, Description)" +
          " VALUES(@PhotoId, @Description)";

   using (SqlConnection conn = new SqlConnection(ConnStr))
   {
       conn.Open();

       // create transaction here and let it stay alive!
       using (SqlTransaction txn = conn.BeginTransaction())
       {
            using (SqlCommand cmd = new SqlCommand(InsertCmd, conn, txn))
            {
               cmd.Parameters.Add("@PhotoId", SqlDbType.Int).Value = photoId;
               cmd.Parameters.Add("@Description", SqlDbType.VarChar).Value = desc;
               cmd.ExecuteNonQuery();
            }

            SafeFileHandle handle = GetOutputFileHandle(photoId, txn);

            MemoryStream inputStream = new MemoryStream(imSource);

            using (FileStream dest = new FileStream(handle, FileAccess.Write))
            {
               byte[] buffer = new byte[BlockSize];
               int bytesRead;

               while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0)
               {
                   dest.Write(buffer, 0, bytesRead);
               }
               dest.Close();
            }

            inputStream.Close();

            // commit transaction here, after all is done                
            txn.Commit();
        }
        conn.Close();
    }
}

Isso é adaptado da postagem do blog SQL Server 2008 FileStream Parte 3: API OpenSQLFileStream - Confira isso por todos os meios!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top