2009-06-02 3 views
0


Warum ist der Matching-Algorithmus von ObjectDataSource nicht so flexibel wie ...?

Obwohl UpdateNames gespeicherte Prozedur nur eine Takes Parameter namens @first, sind wir noch in der Lage zusätzliche Parameter zu definieren namens Last, und das Update noch erfolgreich sein:

<asp:SqlDataSource ... UpdateCommand="UpdateNames" 
     UpdateCommandType="StoredProcedure"> 
     <UpdateParameters> 
      <asp:Parameter Name="First" Type="String" /> 
      <asp:Parameter Name="Last" Type="String" /> 
     </UpdateParameters> 
    </asp:SqlDataSource> 


Aber wenn Sie mit ObjectDataSource Kontrolle, die Anzahl der Parameter rs, die in ObjectDataSource definiert sind, muss genau mit der Anzahl der Parameter übereinstimmen, die in UpdateNames() Methode definiert sind. Wenn also UpdateNames() nimmt nur einen Parameter namens Erste, wird die folgende

 <asp:ObjectDataSource ... UpdateMethod="UpdateNames"> 
     <UpdateParameters> 
      <asp:Parameter Name="First" Type="String" /> 
      <asp:Parameter Name="Last" Type="String" /> 
     </UpdateParameters> 
    </asp:ObjectDataSource> 


A eine Ausnahme verursachen) Warum ist nicht Object des Matching-Algorithmus so flexibel wie SqlDataSource des Matching-Algorithmus und ignoriert daher irgendwelche zusätzlichen Parameter?


Danke

Antwort

2

Die Object für eine andere Art von Flexibilität handelt.

Sie haben zwar Recht, dass die Parameter Ihrer Funktion den aufgeführten Parametern genau entsprechen, aber das hat einen guten Grund.

Mit der ObjectDataSource können Sie mehrere Funktionen definieren, die unterschiedliche Parameter behandeln. Wenn Sie also eine UpdateNames() -Methode unterstützen möchten, die entweder einen Vornamen oder einen Vor- und Nachnamen haben kann, definieren Sie einfach beide Funktionen und behandeln diese Du siehst fit.

using System.ComponentModel; 

[DataObject] 
public class MyODS 
{ 
    [DataObjectMethod(DataObjectMethodType.Update)] 
    public void UpdateNames(string First) 
    { 
     UpdateNames(First, null) 
    } 

    [DataObjectMethod(DataObjectMethodType.Update)] 
    public void UpdateNames(string First, string Last) 
    { 
     //Do the update 
    } 
} 
+0

Also, wenn ObjectDataSource hatte den gleichen passenden Algorithmus wie SqlDataSource, dann weiß es möglicherweise nicht, welche der überladenen Methoden zu nennen ?! – SourceC

1

Eine vollständige Vermutung, aus der Erfahrung mit den beiden:

Die SQL-Version geht nur durch das Array-Skript ein SQL die gespeicherte Prozedur excute, Anfügen die Variablen wie es geht.

Die ObjectDataSource verwendet Reflektion, um eine Aktualisierungsmethode zu finden, die den übergebenen Parametern entspricht. Es schlägt also fehl, wenn für das Objekt, das die angegebenen Parameter verwendet, keine passende Methode existiert.

1

Sie können daran denken, als ob Ihr SqlDataSource in SQL „übersetzt“ wurden, und dies ist absolut gültige SQL:

DECLARE @First varchar(50) 
DECLARE @Last varchar(50) 
SELECT @First = 'some value', @Last = 'some other value' 

SELECT * FROM [MyTable] WHERE FirstName= @First 

Auf der anderen Seite können Sie eine Object denken, als ob es übersetzt wurden in Anrufe mit Reflection-Funktionen wie PropertyInfo.GetValue() und PropertyInfo.SetValue(). Wenn Sie eines dieser Objekte mit einem Objekt oder einem Feld aufrufen, das nicht existiert, erhalten Sie eine Ausnahme.

Verwandte Themen