2015-09-09 28 views
0

我目前正在ASP.NET MVC中的第一年实习页面上工作:它让员工输入花费的小时数(0到8)特定项目每月每天。在我的ASP.NET MVC页面中SQL INSERT失败后的命令

界面,显示,选择和形式发送似乎是现在的工作 - 但一旦我做我的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"); 

使得它失败?请注意,大部分代码不是我的,并且是最后一个实习生,我只是在纠正错误。

这里是我的ConnectionStrings我的web.config的部分:

<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\ 

是什么剩下要做的就是保存表单发送的输入s显示在页面上。

感谢您的帮助。

编辑:

替换为以下整个的OleDb nonesense:

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中显示存储的信息。

+0

你在'catch'上放置了一个断点来看看'Exception ex'中的错误是什么? – scgough

+1

不要用字符串连接组成你的SQL命令。 [改用参数](https://msdn.microsoft.com/en-us/library/ms254953(v = vs.110).aspx)。 – Konamiman

+1

[** USE PARAMETERISED QUERIES !!! **](http://blog.codinghorror.com/give-me-parameterized-sql-or-give-me-death/),如果你不离开自己对恶意SQL注入攻击开放,格式错误的SQL(这可能是导致您的异常的原因),数据转换/截断错误,以及您无法使用缓存的查询计划,强制在每次执行时重新编译查询。总之,使用字符串连接来组成SQL语句没有任何好的理由。 – GarethD

回答

1

您应该使用parameterised queries,如果你没有,你会把自己暴露给恶意的SQL注入攻击,恶意SQL(这可能是什么原因造成的除外),数据转换/截断误差,并且您无法使用缓存的查询计划,从而在每次执行时强制重新编译查询。总之,使用字符串连接来组成SQL语句没有任何好的理由。

如果您使用的是SQL Server,那么您应该使用System.Data.SqlClient命名空间,并且由于您正在运行insert语句并且没有得到任何结果,请使用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(); 
    } 
} 
+0

非常感谢,我试图将变量的名称更改为好的,但我收到以下消息:'初始化字符串的格式不符合从索引0开始的规范。“”值“代表什么在你分享的代码中?编辑:我收到错误,一旦我达到'使用(System.Data.SqlClient.SqlConnection连接=新的SqlConnection(SQL))' – Christopher

+0

该行不会出现在我发布。您需要将连接字符串传递给SqlConnection的构造函数,看起来好像您正在传递SQL语句。 – GarethD

+0

哦,绝对,我的坏。它似乎工作!非常感谢您的意见,我从中吸取了教训。 – Christopher

0

导师时间: 这是不可取来构建你的代码中的sqlscript因为它可以注射用另一套SQL脚本,如果使用是知识渊博。