将C#表单文本作为参数传递给SQL Server

时间:2018-08-29 14:32:12

标签: c# sql-server

我有一个带有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);
}

2 个答案:

答案 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是正确的,您也无需将类型设置为结构化