2017-06-21 5 views
0

ist meine manuelle Abfrage Arbeit in SQL zum MSSQL:gespeicherte Prozedur mit Array-Parameter csharp Diese

SELECT * FROM Accounts where Phone in ('05763671278','05763271578','04763125578') 

wie kann ich Parameter wie folgt aus csharp auf gespeicherte Prozedur erhalten?

Ich habe ein Telefon-Array in C#. Ich bekomme dieses Array von Parametern aus einer Ansicht (Multi Kontrollkästchen aktiviert). Dies ist meiner Ansicht nach:

<td><input type="checkbox" class="CheckboxClass" value="'@item.Phones'"/></td> 

Das ist mein Controller-Aktion:

public ActionResult SendSMSOrMail(string[] values){ 

    // this give "'05763671278','05763271578','04763125578'" 
    string numbers = string.Join(",", values); 
    // ... 
    utility.cmd.Parameters.Add("@numbers", numbers); 
    // ... 
} 

Aber das Ergebnis ist null. Was ist falsch? Ich möchte Ergebnis aller Aufzeichnungen erhalten, die diese Telefone enthalten.

+0

Die Parameter werden in sequenzieller Reihenfolge hinzugefügt und benötigen keinen Namen. Also benutze: utility.cmd.Parameters.Add ("05763671278"); – jdweng

+0

Sie können eine IN-Liste nicht parametrisieren, sondern stattdessen einen Table-Valued-Parameter verwenden, z. https://stackoverflow.com/questions/5595353/how-to-pass-table-value-parameters-to-stored-procedure-from-net-code/ https://stackoverflow.com/questions/2377506/pass- array-parameter-in-sqlcommand –

+0

Verwenden Sie [Tabellenwertparameter] (https://docs.microsoft.com/en-us/sql/relational-databases/tables/use-table-valued-parameters-database-engine) – Sami

Antwort

1

Ich schlage vor, Sie verwenden ein table valued parameter

CREATE TYPE PhonesTableType AS TABLE 
( 
    Phone VARCHAR(12) 
) 
GO 

Dann sollten Sie (bei der Erstellung Skript) erklären, dass Sie gespeicherte Prozedur erwartet einen Parameter dieser Art:

CREATE PROCEDURE dbo.your_stored_procedure_name 
(
    @PhonesTableType PhonesTableType READONLY 
) 
.... 
SELECT A.* 
FROM Accounts AS A 
INNER JOIN @PhonesTableType AS P 
ON A.Phone = P.Phone 

Dann an der C# -Code Sie sollten eine DataTable mit einer Spalte erstellen und dort die Werte übergeben, die Sie erwähnt haben. Zuletzt sollten Sie einen Parameter an Ihre gespeicherte Prozedur übergeben.

var phonesDataTable = new DataTable("Phones"); 
phonesDataTable.Columns.Add("Phone", typeof(string)); 
foreach(var phone in phones) // phones is the values 
{ 
    phonesDataTable.Rows.Add(phone); 
} 

Dann, wenn wir annehmen, dass Sie genannt haben command den Befehl, den Sie fragen würde, ausgeführt werden, bevor es ausgeführt wird Sie die oben als Parameter hinzufügen sollte:

var sqlParameter = new SqlParameter 
{ 
    ParameterName = "@PhonesTableType", 
    SqlDbType = SqlDbType.Structured, 
    Value = phonesDataTable 
}; 
command.Parameters.Add(sqlParameter); 
+0

Die DataTable-Methode ist unordentlich. Sie können eine Sammlung direkt übergeben, obwohl ich kein Beispiel für dieses handliche habe. –

+0

@ErikFunkenbusch Das war mir nicht bewusst. Danke für die Information. Ich werde es mir ansehen. – Christos

1

Es gibt mehrere Möglichkeiten, mach das. Die erste besteht darin, Ihr Array als eine Textzeichenfolge zu erstellen, die durch Kommas oder Semikolons oder ein anderes Trennzeichen getrennt ist. In SQL würden Sie dann diese Zeichenfolge parsen. Das ist ziemlich einfach und unkompliziert, skaliert aber nicht sehr gut und es gibt eine Grenze für die maximale Zeichenlänge eines Parameters.

Eine zweite Möglichkeit besteht darin, einen XML-Parameter zu verwenden. Beispiel hier:

https://stackoverflow.com/a/1069388/61164

Eine dritte Wahl ist, einen Tabellenparameter zu verwenden, die als .NET-Sammlung übergeben werden.

Ich habe kein Beispiel für dieses handliche. Ich habe es schon einmal gemacht, aber das sollte dir genug Informationen geben, um selbst zu suchen.