Datatable et SQL fonction (lecture seul)

Le
zoltix
Bonjour,
Jai une procdure stock en sql server 2005 sp3, qui est un
simple select (select * from .).
Jexcute cette requte en c# pour remplir une datatable. Et cela
fonctionne bien.

Je complique un peu en rajoutant une fonction SQL


alter FUNCTION dbo.qt_GetSector (@FC_test varchar(20))
RETURNS varchar(300)
WITH EXECUTE AS CALLER
AS
BEGIN

return(@FC_test);
end;


je rajoute cette fonction a ma requte (select dbo.qt_GetSector(
qsdf ) as qsdf, * from .). Je re - excute cette procdure en c=
#
et la je maperois que le champ qsdf(cad la fonction) dans la
datatable est devenue en lecture seule.

Je peux modifier le champs de la datatable pour le mettre en criture
programmatiquement. Mais je naime cette solution, car il y a
dautres applications qui utilisent cette requtes et qui
impliqueraient beaucoup de modifications.


Comment puis je modifier ma requte en Tsql pour rendre ce champ qui
contient le rsultat dune fonction SQL visible en criture dans une
DataTable(C#) sans modifier le code de mon application?


Merci davance
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fred BROUARD
Le #18933071
Bonjour,

Par essence, une requête qui contient des transformations de données (et
l'appel à une fonction en est une) ne peut plus être mis à jour. Alors
que cette même requête sans transformation conduit à une vue
"misajourbale" (a condition d'avoir la clef de la table dans les données)

La granule minimale de cohérence dans une base de données est la ligne
de table.

Ce que vous voulez faire n'est donc pas cohérent puisque vous voudriez
pouvoir modifier une ligne dont une colonne est impossible à modifier.

Il est donc logique que les objets clients refusent de vous donner la
main sur cette "chose" !

A vous de nous expliquer votre besoin fonctionnel pour savoir ce que
vous voulez en faire... et comment nous pouvons vous proposer des
solutions plus cohérente !


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************



zoltix a écrit :
Bonjour,
J’ai une procédure stocké en sql server 2005 sp3, qui est un
simple select (select * from ….).
J’exécute cette requête en c# pour remplir une datatable. Et cela
fonctionne bien.

Je complique un peu en rajoutant une fonction SQL


alter FUNCTION dbo.qt_GetSector (@FC_test varchar(20))
RETURNS varchar(300)
WITH EXECUTE AS CALLER
AS
BEGIN

return(@FC_test);
end;


je rajoute cette fonction a ma requête (select dbo.qt_GetSector(«
qsdf« ) as qsdf, * from ….). Je re - exécute cette procédure en c#
et la je m’aperçois que le champ qsdf(cad la fonction) dans la
datatable est devenue en lecture seule.

Je peux modifier le champs de la datatable pour le mettre en écriture
programmatiquement. Mais je n’aime cette solution, car il y a
d’autres applications qui utilisent cette requêtes et qui
impliqueraient beaucoup de modifications.


Comment puis je modifier ma requête en Tsql pour rendre ce champ qui
contient le résultat d’une fonction SQL visible en écriture dans une
DataTable(C#) sans modifier le code de mon application?


Merci d’avance…






Fred
Le #18933431
in news:%, Fred BROUARD wrote :

Bonjour,



Bonjour,

Par essence, une requête qui contient des transformations de données
(et l'appel à une fonction en est une) ne peut plus être mis à jour.



Si la «mise à jour» est nécessaire (sur les colonnes sources de la
fonction par exemple), il y a la possibilité de faire une vue avec des
triggers INSTEAD OF.

--
Fred

zoltix
Le #18933791
Grand merci de votre réponse et Encore un plus grand merci pour votre
livre "SQL 2 édition".


J’ai une application C# WinForm avec une dataGrid lié a une
datatable.
La datatable est remplie par une procédure stocké qui contient une
requête.
Dans cette requête, j’ai ajouté une fonction sql comme un champ. Dans
l’application, Ce champ dans la datable passe en Read/Only donc dans
le datagrid aussi, et on ne peut pas changer sa valeurs dans la
winform, Ce datagrid est généré automatiquement lorsqu’on bind la
Databale. Comment puis-je contrôler cette étape ?

Lorsqu’on modifie ce champs, il y un événement qui est émis pour
intercepter et permet de lancer des procédures de traitement
particulier. Mais comme, le datagrid est généré automatiquement, je
n’ai pas de contrôle au niveau applicatif si c'est généré par .NE T,
j’aurais voulu trouvé une façon de faire en Tsql pour éviter au
développeurs de devoir modifier leur prog.

J’espère avoir été plus clair…..





On 19 mar, 09:21, Fred BROUARD
Bonjour,

Par essence, une requête qui contient des transformations de données (et
l'appel à une fonction en est une) ne peut plus être mis à jour. Al ors
que cette même requête sans transformation conduit à une vue
"misajourbale" (a condition d'avoir la clef de la table dans les donnée s)

La granule minimale de cohérence dans une base de données est la lign e
de table.

Ce que vous voulez faire n'est donc pas cohérent puisque vous voudriez
pouvoir modifier une ligne dont une colonne est impossible à modifier.

Il est donc logique que les objets clients refusent de vous donner la
main sur cette "chose" !

A vous de nous expliquer votre besoin fonctionnel pour savoir ce que
vous voulez en faire... et comment nous pouvons vous proposer des
solutions plus cohérente !

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langag e SQL
Le site sur le langage SQL et les SGBDR  :  http://sqlpro.developpez. com
Audit, conseil, expertise, formation, modélisation, tuning, optimisatio n
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technolog ies
***********************http://www.sqlspot.com*************************

zoltix a écrit :

> Bonjour,
>    J’ai une procédure  stocké en sql server 2005 sp3,  qu i est un
> simple select (select * from ….).
> J’exécute cette requête en c# pour remplir une datatable.  Et c ela
> fonctionne bien.

> Je complique un peu en rajoutant une fonction SQL

> alter FUNCTION dbo.qt_GetSector (@FC_test varchar(20))
> RETURNS varchar(300)
> WITH EXECUTE AS CALLER
> AS
> BEGIN

>    return(@FC_test);
> end;

> je rajoute cette fonction a ma requête (select dbo.qt_GetSector(«
> qsdf« ) as qsdf,  * from ….).  Je re - exécute cette procéd ure en c#
> et la je m’aperçois que le champ qsdf(cad la fonction) dans la
> datatable est devenue en lecture seule.

> Je peux modifier le champs de la datatable  pour le mettre en écrit ure
> programmatiquement.   Mais je n’aime cette solution, car il y a
> d’autres applications qui utilisent cette requêtes et qui
> impliqueraient beaucoup de modifications.

> Comment puis je modifier ma requête en Tsql pour rendre ce champ qui
> contient le résultat d’une fonction SQL visible en écriture dans une
> DataTable(C#) sans modifier le code de mon application?

> Merci d’avance…



Grand merci de votre réponse et Encore un plus grand merci pour votre
livre "SQL 2 edition".

Mes besoins fonctionnels:
Publicité
Poster une réponse
Anonyme