命令后SQL INSERT失败在我的ASP.asp.net MVC页面
本文关键字:asp ASP net MVC 页面 我的 SQL INSERT 失败 命令 | 更新日期: 2023-09-27 18:11:55
我目前正在ASP的页面上工作。. NET MVC:它让员工输入一个月里每天花在一个特定项目上的小时数(0到8之间)。
界面,显示,选择和表单发送似乎现在工作-但一旦我做我的SQL请求它似乎阻塞在这里:
foreach (string s in sDays)
{
string[] values = s.Split(' ');
string strQuery = "INSERT INTO UserActivity (CalendarDate,ProjectId,Login,TaskId,ActivityTypeId,Cost) VALUES (";
strQuery += "'" + (new DateTime(iYear, iMonth, int.Parse(values[1]))).ToString("yyyy/MM/dd") + "'"; //We 2 donne [0] We et [1] 2
strQuery += " , " + iProjectid;
strQuery += " , '" + sLogin + "'";
strQuery += " , NULL";
strQuery += " , 0";
strQuery += " , " + datas[i++];
strQuery += ")";
mDB_DataAdapter = new OleDbDataAdapter(strQuery, m_strConnectionString);
mDB_DataAdapter.Fill(mDB_DataSet, "UserActivity"); // Right here !
mDB_DataAdapter = null;
System.Threading.Thread.Sleep(50);
}
它直接将我发送到:
catch (Exception ex) // The 'System.Data.SqlClient' provider is not registered on the local machine.
{
bRet = false;
}
怎么来的命令
mDB_DataAdapter.Fill(mDB_DataSet, "UserActivity");
使它失败?请注意,大部分代码不是我的,是最后一个实习生的,我只是在纠正错误。
这是我的Web的connectionStrings部分。配置:
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=.'SQLEXPRESS;Initial Catalog=aspnet-CRAWebSiteMVC-20131119145412;Integrated Security=SSPI" providerName="System.Data.SqlClient" />
<add name="CRA" connectionString="metadata=res://*/Models.CRA.csdl|res://*/Models.CRA.ssdl|res://*/Models.CRA.msl;provider=System.Data.SqlClient;provider connection string="data source=MMSDEVNEW'SQL2008;initial catalog=CRAV34;persist security info=True;user id=sa;password=as0;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
<add name="CRAEntities" connectionString="metadata=res://*/Models.CRA.csdl|res://*/Models.CRA.ssdl|res://*/Models.CRA.msl;provider=System.Data.SqlClient;provider connection string="data source=MMSDEVNEW'SQL2008;initial catalog=CRAV34;persist security info=True;user id=sa;password=as0;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
<add name="CRAV34Entities" connectionString="metadata=res://*/Models.CRA.csdl|res://*/Models.CRA.ssdl|res://*/Models.CRA.msl;provider=System.Data.SqlClient;provider connection string="data source=MMSDEVNEW'SQL2008;initial catalog=CRAV34;persist security info=True;user id=sa;password=as0;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
和m_strConnectionString的初始化:
public UserActivityDb(string strConnectionString)
{
m_strConnectionString = strConnectionString;
}
m_strConnectionString包含我的连接字符串:
metadata=res://*/Models.CRA.csdl|res://*/Models.CRA.ssdl|res://*/Models.CRA.msl;provider=System.Data.SqlClient;provider connection string='"data source=MMSDEVNEW''SQL2008;initial catalog=CRAV34;persist security info=True;user id=sa;password=as0;multipleactiveresultsets=True;App=EntityFramework'
剩下要做的是保存表单发送的输入,并通过它在页面上显示。
谢谢你的帮助。
EDIT:
将整个OleDb的废话替换为以下内容:
System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(m_strConnectionString);
conn.Open();
System.Data.SqlClient.SqlCommand comm = new System.Data.SqlClient.SqlCommand(strQuery, conn);
comm.ExecuteNonQuery();
像一个魅力(显然),但它不显示信息,我现在必须弄清楚如何显示存储的信息在我的Db。
你应该使用参数化查询,如果你不让你自己打开恶意SQL注入攻击,畸形的SQL(这可能是什么导致你的异常),数据转换/截断错误,你不能利用缓存的查询计划,每次执行时强制重新编译你的查询。简而言之,没有一个好的理由使用字符串连接来组成你的SQL语句。
您应该使用System.Data.SqlClient
命名空间,如果您正在使用SQL Server,并且由于您正在运行插入语句而没有得到任何结果,请使用ExecuteNonQuery()
。
using System.Data;
using System.Data.SqlClient;
....
string sql = @"INSERT UserActivity (CalendarDate, ProjectId, Login, ActivityTypeId, Cost)
VALUES (@CalendarDate, @ProjectId, @Login, 0, @Cost);";
foreach (var s in days)
{
using (var connection = new SqlConnection(strQuery))
using (var command = new SqlCommand(sql, connection))
{
command.Parameters.Add("@CalendarDate", SqlDbType.DateTime).Value = new DateTime(iYear, iMonth, int.Parse(values[1]));
command.Parameters.Add("@ProjectID", SqlDbType.Int).Value = iProjectid;
command.Parameters.Add("@Login", SqlDbType.VarChar, 50).Value = sLogin;
command.Parameters.Add("@Cost", SqlDbType.Money).Value = datas[i++];
connection.Open();
command.ExecuteNonQuery();
}
}
问题是由于OleDbDataAdapter,你应该使用SqlDataAdapter。点击此链接-连接字符串oledb中的提供程序字段
如果您正在访问SQL Server,为什么使用OleDbDataAdapter
?您应该使用SqlDataAdapter。
辅导时间:在您的代码中构造sqlscript是不可取的,因为它可以被注入到另一组SQL脚本中,如果用户熟悉的话。