如何使用 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
的示例,您可以从中推断出 string
到 DateTime
的转换。
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...
我正在使用带有存储过程的 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
的示例,您可以从中推断出 string
到 DateTime
的转换。
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...