Announcement

Collapse
No announcement yet.

C# und SQL Server

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • C# und SQL Server

    Hallo,
    wie kann man mit C# die ganze Datei in einer SQL-Server Tabelle speichern? Vielen Dank im Voraus!

  • #2
    Hallo,

    angenommen, die Tabelle in der MS SQL Server-Datenbank hat die folgende Struktur:
    <pre>

    USE tempdb
    GO
    CREATE TABLE BLOBTEST (
    blob_id INTEGER NOT NULL IDENTITY PRIMARY KEY,
    recver TIMESTAMP,
    textinhalt TEXT,
    blob IMAGE)
    GO

    </pre>
    Als Beispiel habe ich ein .NET Enterprise Services-Objekt zur Hand, dass den binären Dateiinhalt als Byte-Array übergeben bekommt und diese Datei in der Datenbank archiviert. Die SqlCommand-Instanz führt dabei die folgende Anweisung aus: <i>INSERT INTO BLOBTEST(blob) VALUES (@blob)</i>
    <pre>

    <b>public</b> <b>int</b> SaveFileContent(<b>byte</b>[] aBLOBBuffer, <b>ref</b> <b>string</b> sMsg)
    {
    <b>int</b> iReturn = 0;
    <b>try</b>
    {
    SqlConnection aCon = <b>new</b> SqlConnection(sCS);
    SqlCommand aCmd = <b>new</b> SqlCommand(sSQL, aCon);
    aCmd.Parameters.Add(<font color="#9933CC">&quot;@blob&quot;</font>, SqlDbType.VarBinary, 2147483647, <font color="#9933CC">&quot;blob&quot;</font>).Value = aBLOBBuffer;
    aCon.Open();
    <b>try</b>
    {
    aCmd.ExecuteNonQuery();
    <font color="#003399"><i>// alles in Ordnung</i></font>
    iReturn = 1;
    }
    <b>finally</b>
    {
    aCon.Close();
    aCmd.Dispose();
    aCon.Dispose();
    }
    ContextUtil.SetComplete();
    }
    <b>catch</b> (Exception aExc)
    {
    sMsg = aExc.Message + Environment.NewLine + aExc.StackTrace;
    ContextUtil.SetAbort();
    }
    <b>return</b> iReturn;
    }

    </pre>

    Um den Dateiinhalt in einem Byte-Array abzulegen, kann man in C# folgendes machen:
    <pre>

    <font color="#003399"><i>// ausgewählten Datei-Inhalt in ein Byte-Array einlesen</i></font>
    FileStream aFS = <b>new</b> FileStream(TextBoxIN.Text, FileMode.Open, FileAccess.Read);
    <b>byte</b>[] aData = <b>new</b> <b>byte</b>[Convert.ToInt32(aFS.Length)];
    aFS.Read(aData, 0, Convert.ToInt32(aFS.Length));
    aFS.Close();

    </pre&gt

    Comment


    • #3
      Hallo,
      das hat super geklappt, danke. Und noch eine Frage: wie kann man jetzt diese Datei aus der SQL-Tabelle aufrufen? Soll man auch Stream benutzen oder einfache Select-Abfrage reicht?
      Vielen Dank im Voraus!
      Christia

      Comment


      • #4
        Hallo,

        eine einfache SELECT-Abfrage reicht dazu völlig aus:

        <pre>

        const string sSELECT = "SELECT blob FROM dbo.BLOBTEST WHERE blob_id = @blob_id";

        public byte[] GetFileContent(int iblob_id)
        {
        byte[] aBuffer = new byte[0];
        SqlConnection aCon = new SqlConnection(sCS);
        SqlCommand aCmd = new SqlCommand(sSELECT, aCon);
        aCmd.Parameters.Add("@blob_id", SqlDbType.Int, 4).Value = iblob_id;
        aCon.Open();
        try
        {
        aBuffer = (byte[]) aCmd.ExecuteScalar();
        }
        finally
        {
        aCon.Close();
        }
        return aBuffer;
        }
        </pre>

        Über eine <b>FileStream</b>-Instanz kann der Inhalt des Byte-Array dann in eine Datei geschrieben werden

        Comment

        Working...
        X