OVH Cloud OVH Cloud

SqlCommandBuilder

3 réponses
Avatar
alan
Bonjour
Désolé, j'ai encore un problème : Comment forcer un SQLCommandBuilder à
générer la commande Select après la commande update ou insert
(Ex : Update MATABLE set MaCol = @P1 WHERE MaClePrimaire = @P2 ; SELECT
MaCol FROM MATABLE WHERE MaClePrimaire = @P2 )

Merci d'avance

3 réponses

Avatar
Ambassadeur Kosh
apres un rapide coup d'oeil, à part en scotchant le sql du select à celui
obtenu pour les autres, je vois pas comment faire. cf le code du Update dans
le DbCommandBuilder. à voir si il faut creer son propre CommandBuilder ou si
il faut integrer ce "concept" dans celui existant, je ne sais que dire...

private DbCommand BuildUpdateCommand(DataTableMapping mappings, DataRow
dataRow)
{
DbCommand command1 = this.InitializeCommand(this.UpdateCommand);
StringBuilder builder1 = new StringBuilder();
string text2 = " SET ";
int num1 = 0;
builder1.Append("UPDATE ");
builder1.Append(this.QuotedBaseTableName);
DbSchemaRow[] rowArray1 = this._dbSchemaRows;
for (int num2 = 0; num2 < rowArray1.Length; num2++)
{
DbSchemaRow row1 = rowArray1[num2];
if (((row1 != null) && (row1.BaseColumnName.Length != 0)) &&
this.IncludeInUpdateSet(row1))
{
object obj1 = null;
string text1 = this._sourceColumnNames[num2];
if ((mappings != null) && (dataRow != null))
{
DataColumn column1 = this.GetDataColumn(text1,
mappings, dataRow);
if ((column1 == null) || (row1.IsReadOnly &&
column1.ReadOnly))
{
goto Label_0139;
}
obj1 = this.GetColumnValue(dataRow, column1,
DataRowVersion.Current);
if (!this.SetAllValues)
{
object obj2 = this.GetColumnValue(dataRow,
column1, DataRowVersion.Original);
if ((obj2 == obj1) || ((obj2 != null) &&
obj2.Equals(obj1)))
{
goto Label_0139;
}
}
}
builder1.Append(text2);
text2 = ", ";
builder1.Append(this.QuotedColumn(row1.BaseColumnName));
builder1.Append(" = ");
builder1.Append(this.CreateParameterForValue(command1,
this.GetBaseParameterName(num2), text1, DataRowVersion.Current, num1, obj1,
row1, StatementType.Update, false));
num1++;
}
Label_0139:;
}
bool flag1 = 0 == num1;
num1 = this.BuildWhereClause(mappings, dataRow, builder1, command1,
num1, true);
command1.CommandText = builder1.ToString();
DbCommandBuilder.RemoveExtraParameters(command1, num1);
this.UpdateCommand = command1;
if (!flag1)
{
return command1;
}
return null;
}

"alan" a écrit dans le message de news:

Bonjour
Désolé, j'ai encore un problème : Comment forcer un SQLCommandBuilder à
générer la commande Select après la commande update ou insert
(Ex : Update MATABLE set MaCol = @P1 WHERE MaClePrimaire = @P2 ; SELECT
MaCol FROM MATABLE WHERE MaClePrimaire = @P2 )

Merci d'avance


Avatar
alan
Merci pour cette réponse, je vais voir ce que cela donne...

Pour information : le code transmit est en C... Je croyais être sur la
newsgroup VB.NET :-)

"Ambassadeur Kosh" a écrit :

apres un rapide coup d'oeil, à part en scotchant le sql du select à celui
obtenu pour les autres, je vois pas comment faire. cf le code du Update dans
le DbCommandBuilder. à voir si il faut creer son propre CommandBuilder ou si
il faut integrer ce "concept" dans celui existant, je ne sais que dire...

private DbCommand BuildUpdateCommand(DataTableMapping mappings, DataRow
dataRow)
{
DbCommand command1 = this.InitializeCommand(this.UpdateCommand);
StringBuilder builder1 = new StringBuilder();
string text2 = " SET ";
int num1 = 0;
builder1.Append("UPDATE ");
builder1.Append(this.QuotedBaseTableName);
DbSchemaRow[] rowArray1 = this._dbSchemaRows;
for (int num2 = 0; num2 < rowArray1.Length; num2++)
{
DbSchemaRow row1 = rowArray1[num2];
if (((row1 != null) && (row1.BaseColumnName.Length != 0)) &&
this.IncludeInUpdateSet(row1))
{
object obj1 = null;
string text1 = this._sourceColumnNames[num2];
if ((mappings != null) && (dataRow != null))
{
DataColumn column1 = this.GetDataColumn(text1,
mappings, dataRow);
if ((column1 == null) || (row1.IsReadOnly &&
column1.ReadOnly))
{
goto Label_0139;
}
obj1 = this.GetColumnValue(dataRow, column1,
DataRowVersion.Current);
if (!this.SetAllValues)
{
object obj2 = this.GetColumnValue(dataRow,
column1, DataRowVersion.Original);
if ((obj2 == obj1) || ((obj2 != null) &&
obj2.Equals(obj1)))
{
goto Label_0139;
}
}
}
builder1.Append(text2);
text2 = ", ";
builder1.Append(this.QuotedColumn(row1.BaseColumnName));
builder1.Append(" = ");
builder1.Append(this.CreateParameterForValue(command1,
this.GetBaseParameterName(num2), text1, DataRowVersion.Current, num1, obj1,
row1, StatementType.Update, false));
num1++;
}
Label_0139:;
}
bool flag1 = 0 == num1;
num1 = this.BuildWhereClause(mappings, dataRow, builder1, command1,
num1, true);
command1.CommandText = builder1.ToString();
DbCommandBuilder.RemoveExtraParameters(command1, num1);
this.UpdateCommand = command1;
if (!flag1)
{
return command1;
}
return null;
}

"alan" a écrit dans le message de news:

> Bonjour
> Désolé, j'ai encore un problème : Comment forcer un SQLCommandBuilder à
> générer la commande Select après la commande update ou insert
> (Ex : Update MATABLE set MaCol = @P1 WHERE MaClePrimaire = @P2 ; SELECT
> MaCol FROM MATABLE WHERE MaClePrimaire = @P2 )
>
> Merci d'avance





Avatar
Ambassadeur Kosh
> Merci pour cette réponse, je vais voir ce que cela donne...
Pour information : le code transmit est en C... Je croyais être sur la
newsgroup VB.NET :-)



arf l'insulte : en C... manque pas un # à la fin ? :)
voici donc la version VB avec mes plus plates excuses
et je n'ai toujours pas trouvé comment faire. si tu connais le nom de
l'assembly qui contient les designers pour les adapters et pour le dataset,
on pourra répondre à la question.
Private Function BuildUpdateCommand(ByVal mappings As DataTableMapping,
ByVal dataRow As DataRow) As DbCommand
Dim command1 As DbCommand = Me.InitializeCommand(Me.UpdateCommand)
Dim builder1 As New StringBuilder
Dim text2 As String = " SET "
Dim num1 As Integer = 0
builder1.Append("UPDATE ")
builder1.Append(Me.QuotedBaseTableName)
Dim rowArray1 As DbSchemaRow() = Me._dbSchemaRows
Dim num2 As Integer
For num2 = 0 To rowArray1.Length - 1
Dim row1 As DbSchemaRow = rowArray1(num2)
If (((Not row1 Is Nothing) AndAlso (row1.BaseColumnName.Length
<> 0)) AndAlso Me.IncludeInUpdateSet(row1)) Then
Dim obj1 As Object = Nothing
Dim text1 As String = Me._sourceColumnNames(num2)
If ((Not mappings Is Nothing) AndAlso (Not dataRow Is
Nothing)) Then
Dim column1 As DataColumn = Me.GetDataColumn(text1,
mappings, dataRow)
If ((column1 Is Nothing) OrElse (row1.IsReadOnly
AndAlso column1.ReadOnly)) Then
goto Label_0139
End If
obj1 = Me.GetColumnValue(dataRow, column1,
DataRowVersion.Current)
If Not Me.SetAllValues Then
Dim obj2 As Object =
Me.GetColumnValue(dataRow, column1, DataRowVersion.Original)
If ((obj2 Is obj1) OrElse ((Not obj2 Is
Nothing) AndAlso obj2.Equals(obj1))) Then
goto Label_0139
End If
End If
End If
builder1.Append(text2)
text2 = ", "
builder1.Append(Me.QuotedColumn(row1.BaseColumnName))
builder1.Append(" = ")
builder1.Append(Me.CreateParameterForValue(command1,
Me.GetBaseParameterName(num2), text1, DataRowVersion.Current, num1, obj1,
row1, StatementType.Update, False))
num1 += 1
End If
Label_0139:
Next num2
Dim flag1 As Boolean = (0 = num1)
num1 = Me.BuildWhereClause(mappings, dataRow, builder1, command1,
num1, True)
command1.CommandText = builder1.ToString
DbCommandBuilder.RemoveExtraParameters(command1, num1)
Me.UpdateCommand = command1
If Not flag1 Then
Return command1
End If
Return Nothing
End Function