#.net #sql-server #sql-server-2012
Вопрос:
Я хочу выполнить эту хранимую процедуру из программы на C#.
Я написал следующую хранимую процедуру в окне запроса SQLServer и сохранил ее как сохраненную1:
use master
go
create procedure dbo.test as
DECLARE @command as varchar(1000), @i int
SET @i = 0
WHILE @i < 5
BEGIN
Print 'I VALUE ' CONVERT(varchar(20),@i)
EXEC(@command)
SET @i = @i 1
END
отредактированный:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace AutomationApp
{
class Program
{
public void RunStoredProc()
{
SqlConnection conn = null;
SqlDataReader rdr = null;
Console.WriteLine("nTop 10 Most Expensive Products:n");
try
{
conn = new SqlConnection("Server=(local);DataBase=master;Integrated Security=SSPI");
conn.Open();
SqlCommand cmd = new SqlCommand("dbo.test", conn);
cmd.CommandType = CommandType.StoredProcedure;
rdr = cmd.ExecuteReader();
/*while (rdr.Read())
{
Console.WriteLine(
"Product: {0,-25} Price: ${1,6:####.00}",
rdr["TenMostExpensiveProducts"],
rdr["UnitPrice"]);
}*/
}
finally
{
if (conn != null)
{
conn.Close();
}
if (rdr != null)
{
rdr.Close();
}
}
}
static void Main(string[] args)
{
Console.WriteLine("Hello World");
Program p= new Program();
p.RunStoredProc();
Console.Read();
}
}
}
При этом отображается исключение Cannot find the stored procedure dbo.test
. Нужно ли мне указывать путь? Если да, то в каком месте должны храниться хранимые процедуры?
Комментарии:
1. Вам лучше использовать базу данных, отличную от master, даже для тестирования. Это системная база данных, и в конечном итоге вы вызовете проблемы. В SQL 2012 это не позволит мне создать там таблицу. Это, наоборот, позволит мне создать sproc. :/
2. Несмотря на ответы: вы проверили, действительно ли ваш sp был создан с именем, которое вы дали(dbo.test)? Я не знаю, что произойдет, если пользователь, не являющийся dbo, попытается создать dbo.test… будет ли он создан как не являющийся dbo.test?
3. @obayhan Этот вопрос был задан за 2 года до того, как вы утверждаете, что он является возможным дубликатом. Пожалуйста, в будущем отметьте самый последний вопрос как дубликат.
Ответ №1:
using (var conn = new SqlConnection(connectionString))
using (var command = new SqlCommand("ProcedureName", conn) {
CommandType = CommandType.StoredProcedure }) {
conn.Open();
command.ExecuteNonQuery();
}
Комментарии:
1. Вы даже можете избавиться от того
conn.Close
, что подразумевается подDispose
2. Это верно для данного случая. Мне нравится иметь совпадения
Open
иClose
звонки. Если вы скажете, что в будущем измените объект подключения как поле и удалите оператор using, вы можете случайно забыть добавитьClose
и в итоге получить открытое соединение.3. Как бы вы это сделали, если бы для сохраненного процесса требовались параметры? просто добавьте параметры в объект команды с теми же именами и типами?
4. @Дани, Да. Просто добавьте параметры в
Parameters
коллекциюSqlCommand
объекта.
Ответ №2:
using (SqlConnection conn = new SqlConnection("Server=(local);DataBase=Northwind;Integrated Security=SSPI")) {
conn.Open();
// 1. create a command object identifying the stored procedure
SqlCommand cmd = new SqlCommand("CustOrderHist", conn);
// 2. set the command object so it knows to execute a stored procedure
cmd.CommandType = CommandType.StoredProcedure;
// 3. add parameter to command, which will be passed to the stored procedure
cmd.Parameters.Add(new SqlParameter("@CustomerID", custId));
// execute the command
using (SqlDataReader rdr = cmd.ExecuteReader()) {
// iterate through results, printing each to console
while (rdr.Read())
{
Console.WriteLine("Product: {0,-35} Total: {1,2}",rdr["ProductName"],rdr["Total"]);
}
}
}
Вот несколько интересных ссылок, которые вы могли бы прочитать:
Комментарии:
1. Вам действительно следует использовать ключевое слово «using». Перенесите эту ответственность за открытие/закрытие в рамки.
2. Определение команды SqlCommand:
public sealed class SqlCommand : System.Data.Common.DbCommand, ICloneable, IDisposable
. Изложите это вusing
заявлении, это поможет очистить ситуацию.
Ответ №3:
Вызов хранимой процедуры на языке C#:
SqlCommand cmd = new SqlCommand("StoredProcedureName",con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@value",txtValue.Text);
con.Open();
int rowAffected = cmd.ExecuteNonQuery();
con.Close();
Ответ №4:
using (SqlConnection sqlConnection1 = new SqlConnection("Your Connection String")) {
using (SqlCommand cmd = new SqlCommand()) {
Int32 rowsAffected;
cmd.CommandText = "StoredProcedureName";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = sqlConnection1;
sqlConnection1.Open();
rowsAffected = cmd.ExecuteNonQuery();
}}
Комментарии:
1. Я беспокоюсь о том, как работает cmd. CommandText = «Stored1» интерпретирует мою хранимую процедуру. Я не знаю.
2. «CommandText» должен быть установлен в ИМЯ хранимой процедуры, которая затем выполняется из C#, как если бы вы выполнили «exec StoredProcedureName» в SSMS — или о чем вы беспокоитесь?
3. Как я могу дать имя storedprocedure для вышеуказанной хранимой процедуры, можете ли вы мне сказать, пожалуйста??
4. итак, сначала вам нужно будет создать хранимую процедуру, в случае кода, который у вас есть, вам нужно будет добавить: «создать dbo процедуры. Имя вашего сохраненного процесса указано как» в начале
5. @Cute: если у вас есть это как хранимая процедура, у вас ДОЛЖНО быть имя! Имя, используемое в вызове «СОЗДАТЬ ПРОЦЕДУРУ (имя процедуры)». Если у вас этого нет, то у вас нет хранимой процедуры (а только пакет инструкций T-SQL), и тогда вы не сможете использовать «CommandType = StoredProcedure», очевидно
Ответ №5:
Это код для выполнения хранимых процедур с параметрами и без параметров с помощью отражения. Обратите внимание, что имена свойств объектов должны соответствовать параметрам хранимой процедуры.
private static string ConnString = ConfigurationManager.ConnectionStrings["SqlConnection"].ConnectionString;
private SqlConnection Conn = new SqlConnection(ConnString);
public void ExecuteStoredProcedure(string procedureName)
{
SqlConnection sqlConnObj = new SqlConnection(ConnString);
SqlCommand sqlCmd = new SqlCommand(procedureName, sqlConnObj);
sqlCmd.CommandType = CommandType.StoredProcedure;
sqlConnObj.Open();
sqlCmd.ExecuteNonQuery();
sqlConnObj.Close();
}
public void ExecuteStoredProcedure(string procedureName, object model)
{
var parameters = GenerateSQLParameters(model);
SqlConnection sqlConnObj = new SqlConnection(ConnString);
SqlCommand sqlCmd = new SqlCommand(procedureName, sqlConnObj);
sqlCmd.CommandType = CommandType.StoredProcedure;
foreach (var param in parameters)
{
sqlCmd.Parameters.Add(param);
}
sqlConnObj.Open();
sqlCmd.ExecuteNonQuery();
sqlConnObj.Close();
}
private List<SqlParameter> GenerateSQLParameters(object model)
{
var paramList = new List<SqlParameter>();
Type modelType = model.GetType();
var properties = modelType.GetProperties();
foreach (var property in properties)
{
if (property.GetValue(model) == null)
{
paramList.Add(new SqlParameter(property.Name, DBNull.Value));
}
else
{
paramList.Add(new SqlParameter(property.Name, property.GetValue(model)));
}
}
return paramList;
}
Ответ №6:
SqlConnection conn = null;
SqlDataReader rdr = null;
conn = new SqlConnection("Server=(local);DataBase=Northwind;Integrated Security=SSPI");
conn.Open();
// 1. create a command object identifying
// the stored procedure
SqlCommand cmd = new SqlCommand("CustOrderHist", conn);
// 2. set the command object so it knows
// to execute a stored procedure
cmd.CommandType = CommandType.StoredProcedure;
// 3. add parameter to command, which
// will be passed to the stored procedure
cmd.Parameters.Add(new SqlParameter("@CustomerID", custId));
// execute the command
rdr = cmd.ExecuteReader();
// iterate through results, printing each to console
while (rdr.Read())
{
Console.WriteLine("Product: {0,-35} Total: {1,2}", rdr["ProductName"], rdr["Total"]);
}
Ответ №7:
С помощью Ado.net
using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace PBDataAccess
{
public class AddContact
{
// for preparing connection to sql server database
private SqlConnection conn;
// for preparing sql statement or stored procedure that
// we want to execute on database server
private SqlCommand cmd;
// used for storing the result in datatable, basically
// dataset is collection of datatable
private DataSet ds;
// datatable just for storing single table
private DataTable dt;
// data adapter we use it to manage the flow of data
// from sql server to dataset and after fill the data
// inside dataset using fill() method
private SqlDataAdapter da;
// created a method, which will return the dataset
public DataSet GetAllContactType()
{
// retrieving the connection string from web.config, which will
// tell where our database is located and on which database we want
// to perform opearation, in this case we are working on stored
// procedure so you might have created it somewhere in your database.
// connection string will include the name of the datasource, your
// database name, user name and password.
using (conn = new SqlConnection(ConfigurationManager.ConnectionString["conn"]
.ConnectionString))
{
// Addcontact is the name of the stored procedure
using (cmd = new SqlCommand("Addcontact", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
// here we are passing the parameters that
// Addcontact stored procedure expect.
cmd.Parameters.Add("@CommandType",
SqlDbType.VarChar, 50).Value = "GetAllContactType";
// here created the instance of SqlDataAdapter
// class and passed cmd object in it
da = new SqlDataAdapter(cmd);
// created the dataset object
ds = new DataSet();
// fill the dataset and your result will be
stored in dataset
da.Fill(ds);
}
}
return ds;
}
}
****** Stored Procedure ******
CREATE PROCEDURE Addcontact
@CommandType VARCHAR(MAX) = NULL
AS
BEGIN
IF (@CommandType = 'GetAllContactType')
BEGIN
SELECT * FROM Contacts
END
END
Комментарии:
1. Строки вашего комментария прерываются, также если вы можете указать в своем комментарии хранимую процедуру, которая была бы полезна для нас.
2. добавили хранимую процедуру в код, проверьте ее.
Ответ №8:
это пример хранимой процедуры, которая возвращает значение и выполняется на языке си#
CREATE PROCEDURE [dbo].[InsertPerson]
-- Add the parameters for the stored procedure here
@FirstName nvarchar(50),@LastName nvarchar(50),
@PersonID int output
AS
BEGIN
insert [dbo].[Person](LastName,FirstName) Values(@LastName,@FirstName)
set @PersonID=SCOPE_IDENTITY()
END
Go
--------------
// Using stored procedure in adapter to insert new rows and update the identity value.
static void InsertPersonInAdapter(String connectionString, String firstName, String lastName) {
String commandText = "dbo.InsertPerson";
using (SqlConnection conn = new SqlConnection(connectionString)) {
SqlDataAdapter mySchool = new SqlDataAdapter("Select PersonID,FirstName,LastName from [dbo].[Person]", conn);
mySchool.InsertCommand = new SqlCommand(commandText, conn);
mySchool.InsertCommand.CommandType = CommandType.StoredProcedure;
mySchool.InsertCommand.Parameters.Add(
new SqlParameter("@FirstName", SqlDbType.NVarChar, 50, "FirstName"));
mySchool.InsertCommand.Parameters.Add(
new SqlParameter("@LastName", SqlDbType.NVarChar, 50, "LastName"));
SqlParameter personId = mySchool.InsertCommand.Parameters.Add(new SqlParameter("@PersonID", SqlDbType.Int, 0, "PersonID"));
personId.Direction = ParameterDirection.Output;
DataTable persons = new DataTable();
mySchool.Fill(persons);
DataRow newPerson = persons.NewRow();
newPerson["FirstName"] = firstName;
newPerson["LastName"] = lastName;
persons.Rows.Add(newPerson);
mySchool.Update(persons);
Console.WriteLine("Show all persons:");
ShowDataTable(persons, 14);
Ответ №9:
С помощью Щеголя. поэтому я добавил это, надеюсь, кто-нибудь поможет.
public void Insert(ProductName obj)
{
SqlConnection connection = new SqlConnection(Connection.GetConnectionString());
connection.Open();
connection.Execute("ProductName_sp", new
{ @Name = obj.Name, @Code = obj.Code, @CategoryId = obj.CategoryId, @CompanyId = obj.CompanyId, @ReorderLebel = obj.ReorderLebel, @logo = obj.logo,@Status=obj.Status, @ProductPrice = obj.ProductPrice,
@SellingPrice = obj.SellingPrice, @VatPercent = obj.VatPercent, @Description=obj.Description, @ColourId = obj.ColourId, @SizeId = obj.SizeId,
@BrandId = obj.BrandId, @DisCountPercent = obj.DisCountPercent, @CreateById =obj.CreateById, @StatementType = "Create" }, commandType: CommandType.StoredProcedure);
connection.Close();
}
Комментарии:
1. Его лучше всего использовать
using
перед объявлением соединения или поместить закрытие вfinally
блок. В противном случае, если произойдет исключение, соединение никогда не будет закрыто.
Ответ №10:
Здесь нет щегольского ответа. Поэтому я добавил один
using Dapper;
using System.Data.SqlClient;
using (var cn = new SqlConnection(@"Server=(local);DataBase=master;Integrated Security=SSPI"))
cn.Execute("dbo.test", commandType: CommandType.StoredProcedure);
Ответ №11:
Пожалуйста, проверьте Крейна (я автор)
https://www.nuget.org/packages/Crane/
SqlServerAccess sqlAccess = new SqlServerAccess("your connection string");
var result = sqlAccess.Command().ExecuteNonQuery("StoredProcedureName");
Также есть множество других функций, которые вам могут понравиться.
Комментарии:
1. Как вы возвращаете несколько наборов данных с помощью Crane ? Мой сохраненный процесс возвращает 3 набора данных, и меня интересует только второй набор данных. Но Крейн возвращает мне только первый.
Ответ №12:
Вы имеете в виду, что ваш код-DDL? Если это так, то MSSQL не имеет никакого значения. Приведенные выше примеры хорошо показывают, как это сделать. Просто убедитесь, что
CommandType = CommandType.Text
Ответ №13:
Очень просто и прямолинейно..
SqlCommand cmd = new SqlCommand("StoredProcedureName",con); // Just like you declared it
cmd.CommandType = CommandType.StoredProcedure; // an attribute related to the object
cmd.Parameters.AddWithValue("@value",txtValue.Text); // Parameter name and text source
con.Open();
int rowAffected = cmd.ExecuteNonQuery();
con.Close();
Ответ №14:
Что я сделал, в моем случае я хотел показать результат процедуры в DataGridView:
using (var command = new SqlCommand("ProcedureNameHere", connection) {
// Set command type and add Parameters
CommandType = CommandType.StoredProcedure,
Parameters = { new SqlParameter("@parameterName",parameterValue) }
})
{
// Execute command in Adapter and store to dataset
var adapter = new SqlDataAdapter(command);
var dataset = new DataSet();
adapter.Fill(dataset);
// Display results in DatagridView
dataGridView1.DataSource = dataset.Tables[0];
}