命令后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=&quot;data source=MMSDEVNEW'SQL2008;initial catalog=CRAV34;persist security info=True;user id=sa;password=as0;multipleactiveresultsets=True;App=EntityFramework&quot;" 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=&quot;data source=MMSDEVNEW'SQL2008;initial catalog=CRAV34;persist security info=True;user id=sa;password=as0;multipleactiveresultsets=True;App=EntityFramework&quot;" 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=&quot;data source=MMSDEVNEW'SQL2008;initial catalog=CRAV34;persist security info=True;user id=sa;password=as0;multipleactiveresultsets=True;App=EntityFramework&quot;" 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 INSERT失败在我的ASP.asp.net MVC页面

你应该使用参数化查询,如果你不让你自己打开恶意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脚本中,如果用户熟悉的话。