2009-12-03 3 views
0

Après avoir vérifié abondamment pour une réponse à cette question, je ne peux toujours pas trouver une solution satisfaisante. Alors voilà.Flux entrant et sortant d'un champ d'image SQL Server 2005 avec C#?

Je dois stocker éventuellement une grande quantité de données dans une colonne d'une table SQL Server 2005. J'ai absolument besoin de travailler en mode streaming, de sorte que:

  1. Lors de l'écriture, les données sont envoyées en morceaux dans la base de données. Existe-t-il une méthode intégrée pour réaliser cela à partir du code client C# en utilisant les classes dans System.Data.SqlClient? Ou dois-je recourir à l'utilisation de l'objet Stream ADODB.Net? Je ne sais pas comment mélanger les deux concepts (notamment en ce qui concerne la participation à la SqlTransaction actuelle.

Sinon, est-il un moyen pour une procédure stockée T-SQL pour ajouter données à une colonne existante. Avec cette approche, la procédure stockée sera appelée plusieurs fois à partir du code client et cela permettra d'atteindre l'exigence de diffusion en continu

  1. Lors de la lecture, les données doivent être lues un morceau à la fois, en mode de diffusion en continu

Alternativement, existe-t-il un moyen pour une procédure stockée T-SQL de fournir un accès séquentiel ou même aléatoire au contenu d'un champ d'image?

+0

SQL Server 2008 avec l'attribut FILESTREAM pour les champs VARBINARY (MAX) offre juste cette fonctionnalité - Je ne pense pas qu'il y ait quelque chose comme ça pour SQL Server 2005, cependant :-( –

+0

Oui, vous avez raison. J'ai alors adopté la solution décrite dans ma réponse ci-dessous: –

Répondre

0

En fait, il y a un moyen, ça fait juste un peu mal.

SQL Server 2005 prend en charge la mise à jour une partie d'une colonne: http://technet.microsoft.com/en-us/library/ms177523(SQL.90).aspx

Et vous pouvez faire une lecture d'une partie d'une colonne avec sous-chaîne (oui, même binaire - il vont revenir joyeusement un tableau d'octets). Les avertissements ici sont que c'est seulement une mise à jour - donc vous devez d'abord créer une valeur dans le champ varbinary (max), puis le mettre à jour. Autre que cela, il est tout à fait possible de traiter comme si vous diffusiez des données vers/depuis SQL Server.J'ai enveloppé la fonctionnalité de récupération/mise à jour avec une classe de flux pour me faciliter la vie.

Espérons que cela aide.

+0

Wow thanks! Vous apprenez toujours quelque chose tous les jours ... –

0

Eh bien, répondre à ma propre question.

La vérité est ... il n'y a effectivement pas façon de faire ce que je veux. Soit à partir du code client pur ou des procédures stockées côté serveur dans T-SQL. Jusqu'à ce que nous passions à SQL Server 2008, nous devrons trouver une autre solution.

Cependant, il est effectivement un moyen de simuler ce comportement, de sorte que l'exigence de streaming est atteint. La solution réside dans une collaboration entre code client et serveur.

La base de données du serveur doit, par exemple, exposer l'intégralité du contenu à diffuser en tant qu'ensemble d'enregistrements dans une table fragments. Chaque enregistrement, représentant un morceau de tout le contenu à diffuser. Alors que dans le client, le flux est lu dans l'ordre, et chaque morceau est ensuite envoyé à la base de données pour remplir un enregistrement.

Avec une comptabilité appropriée, la lecture des données stockées peut également être effectuée en mode continu. Incidemment, c'est ce que fait Microsoft BizTalk Server, et c'est ainsi que je le découvre.