将 C# 窗体文本作为参数传递给 SQL Server



我有一个带有MaskedTextBox的 C# 窗体,我需要将其作为parameter传递给我的 SQL Server。

形式:

+-------------------------------------------------------+
|                     ___________                       |
|               Date:|__/__/_____|   <---MaskedTextBox  |
|                                                       |
|                     _________                         |
|                    |btnSubmit|     <---Button         |
|                                                       |
+-------------------------------------------------------+

MaskedTextBox中输入日期时,它会查找与该日期匹配的文件,从中读取,然后将该数据发送到我的 SQL Server。但是,我需要创建一个stored procedure来删除与导入日期匹配的数据 - 因为没有重复的数据。

棘手的部分是,我有将数据发送到添加到我项目的另一个.cs文件上的SQL Server的方法。

方法(方法.cs(:

public void SendTable(DataTable table, string StoredProcedure, string TableType)
{
string conStr = "Data Source=" + ConfigurationManager.AppSettings["DataSource"] + "Initial Catalog=" + ConfigurationManager.AppSettings["InitialCatalog"] + "Integrated Security=True;";
//Use Stored procedure to send data table
using (SqlConnection connection = new SqlConnection(conStr))
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = connection;
cmd.CommandText = StoredProcedure;
connection.Open();
cmd.CommandType = CommandType.StoredProcedure;
var fm = new frmMain();  //Main form located in frmMain.cs
string date = fm.uDate;  //setting string date to a public string, also on frmMain.cs
SqlParameter dtparam = new SqlParameter("@date", table);
dtparam.SqlDbType = SqlDbType.Structured;
dtparam.TypeName = "dbo." + TableType;
cmd.Parameters.Add(dtparam).Value = date;
cmd.ExecuteNonQuery();  //ERROR HERE: Failed to convert parameter value from a String to a IEnumerable`1
}
}

以下是uDate(frmMain.cs(:

public string uDate
{
get { return mtbDate.Text; }
}

如果需要,我的存储过程:

ALTER Procedure [dbo].[Submit]
--Add Parameter
@date AS nvarchar(max)
AS
Begin 
Set NoCount ON
--DELETE FROM _table
Begin Tran T1;
INSERT INTO [Archive]([Customer Name], IDNbr, City, Bal, ONbr, BalDate) SELECT CustName, IDNbr, City, Bal, ONbr, (@date) AS BalDate FROM myView;
Commit Tran T1;
End

提前感谢您的任何帮助或建议!如果有什么不清楚的地方,我很乐意尝试澄清。我已经研究了将参数传递给SQL Server。我试图纠正我认为犯了错误的代码,尽管我仍然犯了错误。

如何将 frmMain 上输入的日期作为参数@date传递给我的 SQL 服务器?

编辑:

单击btnSubmit时:

private void btnSubmit_Click(object sender, EventArgs e)
{
string date = uDate;
string day = date.Substring(3, 2);
string month = date.Substring(0, 2);
string year = date.Substring(8);
string conStr = "Data Source=" + ConfigurationManager.AppSettings["DataSource"] + "Initial Catalog=" + ConfigurationManager.AppSettings["InitialCatalog"] + "Integrated Security=True;";
using (var conn = new SqlConnection(conStr))
{
conn.Open();
SqlCommand cmd = new SqlCommand("Submit", conn);
cmd.CommandType = CommandType.StoredProcedure;                
}            
string suffix = @"myFile.txt";
date = year + month + day;
string prefix = @"\myDirectory";
string fileName = prefix + date + suffix;
ImportList(fileName);
}

然后ImportList()收集数据,读取文件,然后发送 数据通过位于Method.cs上的另一种方法:

public void Send(string StoredProcedure, string TableType)
{
DataTable table = new DataTable();
DataRow Row;
//Gets Column info from list and creates columns in table         
foreach (var column in ExportList[0])
{
table.Columns.Add(column.Key, column.Value.GetType());
}
foreach(var item in ExportList)
{
Row = table.NewRow();
foreach (var column in item)
{ 
Row[column.Key] = column.Value;     
}
table.Rows.Add(Row);
}
//send data table to stored procedure
SendTable(table, StoredProcedure, TableType);
}

将@date的数据类型设置为结构化类型(思考表(而不是nvarchar。提供程序正在尝试通过结构化参数进行枚举。

改变

dtparam.SqlDbType = SqlDbType.Structured;

dtparam.SqlDbType = SqlDbType.NVarChar;

我相信问题出在参数的构造上。

SqlParameter dtparam = new SqlParameter("@date", table);

该构造函数将第二个参数作为值。下面是修改后的代码片段,应该可以更好地工作。

...
SqlParameter dtparam = new SqlParameter("@date", date);
dtparam.SqlDbType = SqlDbType.NVarChar;
dtparam.TypeName = "dbo." + TableType;
...

编辑:Fikse是对的,您也不需要将类型设置为结构化

最新更新