我有一个带有MaskedTextBox
的C#表单,我需要将其作为parameter
传递给SQL Server。
表格:
+-------------------------------------------------------+
| ___________ |
| Date:|__/__/_____| <---MaskedTextBox |
| |
| _________ |
| |btnSubmit| <---Button |
| |
+-------------------------------------------------------+
在MaskedTextBox
中输入日期时,它将查找与该日期匹配的文件,从中读取数据,然后将该数据发送到我的SQL Server。但是,我需要创建一个stored procedure
来删除与导入日期匹配的数据-以确保没有重复的数据。
棘手的是,我有一种方法可以将数据发送到添加到项目中的另一个.cs
文件上的SQL Server中。
方法(Methods.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
在此先感谢您的帮助或建议!如果有任何不清楚的地方,我将很乐意尝试澄清。我研究了Passing parameter to SQL Server。尽管我仍在出错,但我已尝试在我认为出错的地方更正了我的代码。
如何将在frmMain上输入的日期作为参数@date
传递给SQL Server?
编辑:
点击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);
}
答案 0 :(得分:2)
您将@date的数据类型设置为结构化类型(例如表),而不是nvarchar。提供程序正在尝试通过结构化参数进行枚举。
更改
dtparam.SqlDbType = SqlDbType.Structured;
收件人
dtparam.SqlDbType = SqlDbType.NVarChar;
答案 1 :(得分:1)
我相信问题出在您构造参数上。
SqlParameter dtparam = new SqlParameter("@date", table);
该构造函数将第二个参数作为值。这是一段经过修改的代码,应该可以更好地工作。
...
SqlParameter dtparam = new SqlParameter("@date", date);
dtparam.SqlDbType = SqlDbType.NVarChar;
dtparam.TypeName = "dbo." + TableType;
...
编辑:Fikse是正确的,您也无需将类型设置为结构化