我在 Visual Studio 2017 中使用 C# WinForms - 該專案基于從 VB6 到 C# 的轉換,但現在我遇到了一個錯誤,它說我沒有提供引數。但據我所知,我似乎有。
我遇到的錯誤是:程序或函式“uspExportGetMailinfoTest”需要未提供的引數“@CUSTOMER”。
我不知道是因為我的 C# 代碼還是我在 SQL 中遺漏了一些東西。我想知道是否有人可以描述我做錯了什么。我也總是樂于接受任何簡化我的代碼的建議。
C#
SqlConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["ConString"].ConnectionString);
public bool getMailInfo(string sCustomer, ref string sMailTo, ref string sSubject, ref string sMsg)
{
try
{
SqlDataAdapter commSql = null;
DataSet ds = new DataSet();
db.Open();
string sSql = "uspExportGetMailinfoTest";
SqlCommand cmd = new SqlCommand("uspExportGetMailinfoTest", db);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@CUSTOMER", sCustomer);
cmd.ExecuteNonQuery();
commSql = new SqlDataAdapter(sSql, db);
commSql.Fill(ds, "list");
if (ds.Tables["list"].Rows.Count > 0)
{
cmd.Parameters.AddWithValue("mailto", sMailTo);
cmd.Parameters.AddWithValue("subject", sSubject);
cmd.ExecuteNonQuery();
db.Close();
}
else
{
sMsg = "getMailInfo returns blank";
db.Close();
}
return true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
throw;
}
此存盤程序正在從另一個存盤程序中恢復“客戶密鑰”。根據它獲得的密鑰,然后決定哪個客戶將收到郵件。
SP
USE [Flextracker]
GO
/****** Object: StoredProcedure [dbo].[uspExportGetMailinfoTest] Script Date: 2021-11-09 10:34:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[uspExportGetMailinfoTest]
@CUSTOMER as nvarchar(50)
AS
if @CUSTOMER in ('200600','200600-SEK','200600-USD','200602','200603','200604','200606') --2021-01-19 added 200606 --added ,'200603','200604' 20017-04-28
BEGIN
select '\\XYXYX\MansTest' as mailto,'DELIVERY TO XYXYX' as subject
END
uj5u.com熱心網友回復:
如果要使用帶引數的資料配接器,則需要向它傳遞一個SqlCommand帶有引數的物件。
您的代碼還有很多其他問題:
- 所有 Sql 物件都需要在
using塊中 - 不快取連接物件,需要時創建,用
using. 請注意,如果您有一個using塊,則無需呼叫Close() - 您正在呼叫
ExecuteNonQuery(多次),但不回傳結果 - 單行結果不會在引數中回傳,它是一個結果集
- 您可以從您的 中讀取該行
DataSet,但實際上僅使用DataReader - 不要使用
AddWithValue,明確指定引數型別和長度 MessageBox連接打開時不要阻塞。
public bool getMailInfo(string sCustomer, ref string sMailTo, ref string sSubject, ref string sMsg)
{
try
{
using (SqlConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["ConString"].ConnectionString))
using (SqlCommand cmd = new SqlCommand("uspExportGetMailinfoTest", db) {CommandType = CommandType.StoredProcedure})
{
cmd.Parameters.Add("@CUSTOMER", SqlDbType.NVarChar, 50).Value = sCustomer;
db.Open();
using (var reader = cmd.ExecuteReader())
{
if (reader.Read())
{
sMailTo = (string)reader["mailto"];
sSubject = (string)reader["subject"];
}
else
{
sMsg = "getMailInfo returns blank";
}
return true;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
throw;
}
}
對于多行,您將使用 while (reader.Read())
對于單行單列結果,您可以移除閱讀器并使用 cmd.ExecuteScalar()
uj5u.com熱心網友回復:
AddWithValue替換SqlParameterCollection.Add接受字串和物件的方法。不推薦使用字串和物件的 Add 多載,因為SqlParameterCollection.Add使用字串和 SqlDbType 列舉值的多載可能存在歧義,其中傳遞帶有字串的整數可能被解釋為引數值或相應的 SqlDbType 值. 每當您想通過指定名稱和值來添加引數時,請使用 AddWithValue。改用:
cmd.Parameters.Add("@CUSTOMER", SqlDbType.NVarChar, 50);
cmd.Parameters["@CUSTOMER"].Value = sCustomer;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/354046.html
標籤:C# sql sql-server winforms
上一篇:PostgreSQL外鍵陣列
