如何使用 TableAdapter 为存储过程参数转换 Web 窗体值

How to Convert Web Form Values for Stored Procedure Parameters Using TableAdapters

我正在使用带有存储过程的 TableAdapter 创建一个 Web 表单,我很难找到一个参考,以找到将表单字段中的值转换为存储过程参数的正确方法的参考。我有字符串、日期和整数。我认为字符串和日期的格式正确,但我不确定整数。

我在 运行 应用程序时一直收到 "Input string was not in a correct format." 错误。我做错了什么?

提前感谢您的宝贵时间和协助!

这是 TableAdapter 向导生成的测试存储过程:

CREATE PROCEDURE [dbo].InsertQuery
(
@firmName nvarchar(100),
@address nvarchar(200),
@city nvarchar(50),
@state nvarchar(2),
@zipcode nvarchar(15),
@phoneNumber nvarchar(MAX),
@emailAddress nvarchar(MAX),
@website nvarchar(MAX),
@desiredEffDate datetime,
@desiredLimits nvarchar(50),
@desiredLimitsOther1 nvarchar(100),
@desiredLimitsOther2 nvarchar(100),
@desiredDeductible nvarchar(20),
@retroDate datetime,
@insurance nvarchar(10),
@currentCarrier nvarchar(100),
@currentPremium nvarchar(50),
@firmEstablished datetime,
@numParalegals int,
@numStaff int,
@engageLetters nvarchar(10),
@conflictSystem nvarchar(10),
@docketSystem nvarchar(10),
@sueFees nvarchar(10),
@numAttorneys int,
@numClaims int,
@complaint nvarchar(10),
@refusedAdmission nvarchar(10),
@signature nvarchar(200)
)
AS
SET NOCOUNT OFF;
INSERT INTO [dbo].[Firms] ([firmName], [address], [city], [state], [zipcode], [phoneNumber], [emailAddress], [website], [desiredEffDate], [desiredLimits], [desiredLimitsOther1], [desiredLimitsOther2], [desiredDeductible], [retroDate], [insurance], [currentCarrier], [currentPremium], [firmEstablished], [numParalegals], [numStaff], [engageLetters], [conflictSystem], [docketSystem], [sueFees], [numAttorneys], [numClaims], [complaint], [refusedAdmission], [signature]) VALUES (@firmName, @address, @city, @state, @zipcode, @phoneNumber, @emailAddress, @website, @desiredEffDate, @desiredLimits, @desiredLimitsOther1, @desiredLimitsOther2, @desiredDeductible, @retroDate, @insurance, @currentCarrier, @currentPremium, @firmEstablished, @numParalegals, @numStaff, @engageLetters, @conflictSystem, @docketSystem, @sueFees, @numAttorneys, @numClaims, @complaint, @refusedAdmission, @signature)

下面是代码:

    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        FirmsTableAdapter InsertFirmAdapter = new FirmsTableAdapter();
        InsertFirmAdapter.InsertQuery(
            txtFirmName.Text, 
            txtAddress1.Text, 
            txtCity.Text, 
            ddStates.SelectedValue, 
            txtZip.Text, 
            txtPhone.Text, 
            txtEmail.Text, 
            txtWebsite.Text, 
            Convert.ToDateTime(txtEffDate.Text), 
            ddLimits.SelectedValue, 
            txtLimits1.Text, 
            txtLimits2.Text, 
            ddDeductible.SelectedValue, 
            Convert.ToDateTime(txtRetroDate.Text), 
            cblInsurance.Text, 
            txtCurrCarrier.Text, 
            txtCurrPrem.Text, 
            Convert.ToDateTime(txtEstDate.Text), 
            Convert.ToInt32(txtNumParalegals.Text), 
            Convert.ToInt32(txtNumClerical.Text), 
            cblEngageLetters.Text,
            cblConflictSystem.Text, 
            cblDocketSystem.Text, 
            cblSueFees.Text, 
            Convert.ToInt32(txtTotalAttys.Text), 
            Convert.ToInt32(txtClaimsQuantity.Text), 
            cblComplaint.Text, 
            cblRefusedAdmission.Text, 
            txtSignature.Text);
    }

在我切换到使用 TableAdapter 之前,我使用的是 SQL 命令并且这段代码有效,所以我很惊讶 TableAdapter 调用不是:

        string CS = ConfigurationManager.ConnectionStrings["EstimateDB"].ConnectionString;
        using (SqlConnection con = new SqlConnection(CS))
        {
            SqlCommand cmd = new SqlCommand("InsertQuery", con);
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.AddWithValue("@firmName", txtFirmName.Text);
            cmd.Parameters.AddWithValue("@address", txtAddress1.Text);
            cmd.Parameters.AddWithValue("@city", txtCity.Text);
            cmd.Parameters.AddWithValue("@state", ddStates.SelectedValue);
            cmd.Parameters.AddWithValue("@zipcode", txtZip.Text);
            cmd.Parameters.AddWithValue("@phoneNumber", txtPhone.Text);
            cmd.Parameters.AddWithValue("@emailAddress", txtEmail.Text);
            cmd.Parameters.AddWithValue("@website", txtWebsite.Text);
            cmd.Parameters.Add("@desiredEffDate", SqlDbType.DateTime).Value = txtEffDate.Text;
            cmd.Parameters.AddWithValue("@desiredLimits", ddLimits.SelectedValue);
            cmd.Parameters.AddWithValue("@desiredLimitsOther1", txtLimits1.Text);
            cmd.Parameters.AddWithValue("@desiredLimitsOther2", txtLimits2.Text);
            cmd.Parameters.AddWithValue("@desiredDeductible", ddDeductible.SelectedValue);
            cmd.Parameters.Add("@retroDate", SqlDbType.DateTime).Value = txtRetroDate.Text;
            cmd.Parameters.AddWithValue("@insurance", cblInsurance.Text);
            cmd.Parameters.AddWithValue("@currentCarrier", txtCurrCarrier.Text);
            cmd.Parameters.AddWithValue("@currentPremium", txtCurrPrem.Text);
            cmd.Parameters.Add("@firmEstablished", SqlDbType.DateTime).Value = txtEstDate.Text;
            cmd.Parameters.AddWithValue("@numParalegals", txtNumParalegals.Text);
            cmd.Parameters.AddWithValue("@numStaff", txtNumClerical.Text);
            cmd.Parameters.AddWithValue("@engageLetters", cblEngageLetters.Text);
            cmd.Parameters.AddWithValue("@conflictSystem", cblConflictSystem.Text);
            cmd.Parameters.AddWithValue("@docketSystem", cblDocketSystem.Text);
            cmd.Parameters.AddWithValue("@sueFees", cblSueFees.Text);
            cmd.Parameters.AddWithValue("@numAttorneys", txtTotalAttys.Text);
            cmd.Parameters.AddWithValue("@numClaims", txtClaimsQuantity.Text);
            cmd.Parameters.AddWithValue("@complaint", cblComplaint.Text);
            cmd.Parameters.AddWithValue("@refusedAdmission", cblRefusedAdmission.Text);
            cmd.Parameters.AddWithValue("@signature", txtSignature.Text);

            cmd.Connection.Open();
            cmd.ExecuteNonQuery();
        }

这与在将字符串传递给 InsertFirmAdapter.InsertQuery 之前格式化字符串无关。您实际上需要适当的对象,因为存储过程中的某些参数被声明为整数和日期时间。因此,错误是由 Convert.To 调用之一引发的。您可以通过日志记录或调试来跟踪它。调用前的实际值是多少?

编辑
您可以编写自己的方法来验证用户输入。通常,您会在比执行查询之前更高的级别上执行此操作,以便能够通知用户所提供的无效数据。这是一个将 string 转换为 int 的示例,您可以从中推断出 stringDateTime 的转换。

int ParseInt32WithDefault(string value, int defaultValue) {
    int number;
    if (Int32.TryParse(value, out number))
        return number;
    return defaultValue;
}

并调用它而不是 Convert.ToInt32 例如:ParseInt32WithDefault(txtNumParalegals.Text, 0).
但是,这并没有解决问题,而是掩盖了它。您需要查看您执行的所有变量的值列表 Convert.To...