Hoe kan ik Excel-bestanden invoegen/ophalen in de kolom varbinary (max) in SQL Server 2008?

Ik probeer Excel-bestanden in de database op te slaan, ik wil filestream niet gebruiken omdat hiervoor een server nodig is.

Dus hoe plaats/update/selecteer ik in de tabel met een kolom van het type varbinary (max) ?

9

2 antwoord

Als u het in het rechte ADO.NET wilt doen en uw Excel-bestanden niet te groot zijn, zodat ze meteen in het geheugen passen, kunt u deze twee methoden gebruiken:

// store Excel sheet (or any file for that matter) into a SQL Server table
public void StoreExcelToDatabase(string excelFileName)
{
   //if file doesn't exist --> terminate (you might want to show a message box or something)
    if (!File.Exists(excelFileName))
    {
       return;
    }

   //get all the bytes of the file into memory
    byte[] excelContents = File.ReadAllBytes(excelFileName);

   //define SQL statement to use
    string insertStmt = "INSERT INTO dbo.YourTable(FileName, BinaryContent) VALUES(@FileName, @BinaryContent)";

   //set up connection and command to do INSERT
    using (SqlConnection connection = new SqlConnection("your-connection-string-here"))
    using (SqlCommand cmdInsert = new SqlCommand(insertStmt, connection))
    {
         cmdInsert.Parameters.Add("@FileName", SqlDbType.VarChar, 500).Value = excelFileName;
         cmdInsert.Parameters.Add("@BinaryContent", SqlDbType.VarBinary, int.MaxValue).Value = excelContents;

        //open connection, execute SQL statement, close connection again
         connection.Open();
         cmdInsert.ExecuteNonQuery();
         connection.Close();
    }
}

Gebruik de volgende methode om het Excel-blad terug te halen en op te slaan in een bestand:

public void RetrieveExcelFromDatabase(int ID, string excelFileName)
{
    byte[] excelContents;

    string selectStmt = "SELECT BinaryContent FROM dbo.YourTableHere WHERE ID = @ID";

    using (SqlConnection connection = new SqlConnection("your-connection-string-here"))
    using (SqlCommand cmdSelect = new SqlCommand(selectStmt, connection))
    {
        cmdSelect.Parameters.Add("@ID", SqlDbType.Int).Value = ID;

        connection.Open();
        excelContents = (byte[])cmdSelect.ExecuteScalar();
        connection.Close();
    }

    File.WriteAllBytes(excelFileName, excelContents);
 }

Natuurlijk kun je dit aanpassen aan je behoeften - je kunt ook heel veel andere dingen doen - afhankelijk van wat je echt wilt doen (niet erg duidelijk uit je vraag).

15
toegevoegd
Zou het de moeite waard zijn om het bestand te comprimeren voordat je het opslaat? Als de bestanden groot zijn en/of er veel van zijn, kan dit voordelig zijn, indien mogelijk.
toegevoegd de auteur B. Clay Shannon, de bron
XLSX is sowieso gecomprimeerd,
toegevoegd de auteur Alan B, de bron

Het hangt af van de gegevenstoegangstechnologie die u gebruikt. Als u bijvoorbeeld Entity Framework gebruikt, kunt u met behulp van objecten een bytearray in de database opslaan.

0
toegevoegd