Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Datatable et SQL fonction (lecture seul)

3 réponses
Avatar
zoltix
Bonjour,
J=92ai une proc=E9dure stock=E9 en sql server 2005 sp3, qui est un
simple select (select * from =85.).
J=92ex=E9cute cette requ=EAte 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=EAte (select dbo.qt_GetSector(=AB
qsdf=AB ) as qsdf, * from =85.). Je re - ex=E9cute cette proc=E9dure en c=
#
et la je m=92aper=E7ois 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 =E9criture
programmatiquement. Mais je n=92aime cette solution, car il y a
d=92autres applications qui utilisent cette requ=EAtes et qui
impliqueraient beaucoup de modifications.


Comment puis je modifier ma requ=EAte en Tsql pour rendre ce champ qui
contient le r=E9sultat d=92une fonction SQL visible en =E9criture dans une
DataTable(C#) sans modifier le code de mon application?


Merci d=92avance=85

3 réponses

Avatar
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. 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…






Avatar
Fred
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

Avatar
zoltix
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 wrote:
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: