从对象类型System.Web.UI.WebControls.TextBox到已知的托管提供程序本机类型不存在映射

这是我的代码

SqlCommand cmd = new SqlCommand("spRegisterUser", con); cmd.CommandType = CommandType.StoredProcedure; SqlParameter username = new SqlParameter("@UserName", txtUserName.Text); SqlParameter password = new SqlParameter("@Password", txtPassword); SqlParameter email = new SqlParameter("@Email", txtEmail.Text); SqlParameter userType = new SqlParameter("@UserType", SqlDbType.NVarChar, 200); userType.Value = "Student"; cmd.Parameters.Add(username); cmd.Parameters.Add(password); cmd.Parameters.Add(email); cmd.Parameters.Add(userType); con.Open(); int ReturnCode = (int)cmd.ExecuteScalar(); //This is where it displays error message if (ReturnCode == -1) 

有任何想法吗?

这是错误消息

  No mapping exists from object type System.Web.UI.WebControls.TextBox to a known managed provider native type. 

描述:执行当前Web请求期间发生未处理的exception。 请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

 Exception Details: System.ArgumentException: No mapping exists from object type System.Web.UI.WebControls.TextBox to a known managed provider native type. Source Error: Line 48: con.Open(); Line 49: Line 50: int ReturnCode = (int)cmd.ExecuteScalar(); Line 51: if (ReturnCode == -1) Line 52: { Source File: c:\Users\Mubashir\Documents\Visual Studio 2012\Projects\Sit302GroupProject\Sit302GroupProject\Registration\Registration.aspx.cs Line: 50 Stack Trace: [ArgumentException: No mapping exists from object type System.Web.UI.WebControls.TextBox to a known managed provider native type.] System.Data.SqlClient.MetaType.GetMetaTypeFromValue(Type dataType, Object value, Boolean inferLen, Boolean streamAllowed) +2021139 System.Data.SqlClient.SqlParameter.GetMetaTypeOnly() +5287377 System.Data.SqlClient.SqlParameter.Validate(Int32 index, Boolean isCommandProc) +16 System.Data.SqlClient.SqlCommand.SetUpRPCParameters(_SqlRPC rpc, Int32 startCount, Boolean inSchema, SqlParameterCollection parameters) +122 System.Data.SqlClient.SqlCommand.BuildRPC(Boolean inSchema, SqlParameterCollection parameters, _SqlRPC& rpc) +78 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite) +1379 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) +175 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +53 System.Data.SqlClient.SqlCommand.ExecuteScalar() +149 Sit302GroupProject.Registration.btnRegister_Click(Object sender, EventArgs e) in c:\Users\Mubashir\Documents\Visual Studio 2012\Projects\Sit302GroupProject\Sit302GroupProject\Registration\Registration.aspx.cs:50 System.Web.UI.WebControls.Button.OnClick(EventArgs e) +9552602 System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +103 System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +35 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1724 

这是存储过程

  CREATE proc spRegisterUser @Username nvarchar(100), @Password nvarchar(200), @Email nvarchar(200), @UserType nvarchar(200), as Begin Declare @Count int Declare @ReturnCode int Select @Count = COUNT(UserName) from tblUsers where UserName = @UserName If @COunt > 0 Begin Set @Return = -1 End Else Begin Set @ReturnCode = 1 Insert into tblUsers values (@UserName, @Password, @Email, @UserType) End Select @ReturnCode as ReturnValue End 

您正在传递txtPassword ,它是TextBox的一个对象,因此您将获得exception。

问题是符合的

 SqlParameter password = new SqlParameter("@Password", txtPassword); 

所以将代码更改为

 SqlParameter password = new SqlParameter("@Password", txtPassword.Text); 

这是一个将SQL参数传递给存储过程的函数:

 public static SqlParameter Parameter( SqlDbType dbtype, string ParameterName, string Value) { SqlParameter param = new SqlParameter(); param.ParameterName = ParameterName; param.SqlDbType = dbtype; param.SqlValue = Value; return param; // cmd.Parameters.Add(param); } 

您可以使用此function

 SqlCommand cmd = new SqlCommand("SP_Name"); cmd.Parameter.Add(Parameter(SqlDbType.DateTime,"@Parameter",DateTimepicker.Text)); 

要么

 SqlParameter[] parameters = { new SqlParameter("@Task", "insert"), new SqlParameter("@Name", clsPluginHelper.DbNullIfNullOrEmpty(txtinstalName.Text)), new SqlParameter("@Descp", clsPluginHelper.DbNullIfNullOrEmpty(txtInstDescp.Text)), clsPluginHelper.Parameter(SqlDbType.DateTime, "@StartDate",dtpInstStartDate.Text), clsPluginHelper.Parameter(SqlDbType.DateTime, "@EndDate",dtpInstalEndDate.Text) };