通过C#代码将文件路径字符串插入SQL数据库

时间:2014-10-02 11:09:20

标签: c# sql linq

在SQL中:

INSERT INTO [dbo].[tblFiles]
           ([FullFilePath]
           ,[LastModified])
     VALUES
           ('P:\test\test.csv', 
           null)

这将存储数据库中的完整路径:) 但是,我需要在代码中执行此操作。

    SqlConnection connection = new SqlConnection(DatabaseHelper.ConnectionString);
    connection.Open();

    SqlCommand command = new SqlCommand( "stpInsertFile", connection);
    command.CommandType = System.Data.CommandType.StoredProcedure;
    command.Parameters.Add(new SqlParameter("@filepath", System.Data.SqlDbType.VarChar));
    command.Parameters["@filepath"].Value = article.FullFilePath;

    command.Parameters.Add(new SqlParameter( "@LastModified", System.Data.SqlDbType.DateTime));
    command.Parameters["@LastModified"].Value = article.LastModified;


    int newArticleID = Convert.ToInt32((decimal)command.ExecuteNonQuery());

    command.Dispose();
    connection.Close();
    connection.Dispose();

    return newArticleID;

有了这一切,我得到的是' P'在完整路径列中。 所以我尝试使用LINQ并得到了相同的结果。

   public int InsertArticleUsingLINQ(tblFile article) {
            DataClassesDataContext context = new DataClassesDataContext();

                tblFile newFileEntry = new tblFile();
                newFileEntry.FullFilePath = article.FullFilePath;
                newFileEntry.LastModified = article.LastModified;
                context.tblFiles.InsertOnSubmit(newFileEntry);
                context.SubmitChanges();

                return newFileEntry.ID;

        }

在将字符串传递给数据库插入函数之前,我没有对字符串做任何事情。我读到你需要逃避反斜杠,但它似乎逃脱了报价。另请注意,在sql之前需要@符号,但是如何将其添加到参数中?

3 个答案:

答案 0 :(得分:1)

如果stpInsertFile是存储过程,则必须在代码中设置:

...
 command.CommandType = CommandType.StoredProcedure;

否则你必须在命令中设置查询字符串:

 SqlCommand command = new SqlCommand( "INSERT INTO [dbo].[tblFiles] ([FullFilePath] [LastModified])  VALUES  (@filepath,@LastModified)", connection);
...

答案 1 :(得分:1)

警告:由于您没有共享存储过程代码,这只是一个疯狂的猜测。

您是否在存储过程的定义中设置了@filePath参数的大小?

如果您将其声明为:

create procedure stpInsertFile
    @filepath     varchar,
    @LastModified datetime
as
...

然后你的参数被创建为varchar(1),因为varchar数据类型的默认行为会产生你得到的结果。
请在ms网站上查看reference documentation的char和varchar数据类型

答案 2 :(得分:0)

在上述选项中,即使手动添加引号,ADO代码也不会复制完整路径。我得到的只是数据库中的一个字符。

进一步检查时,参数的类型为Varchar(1)!!!我将其更改为Varchar(255)并且有效。

注意,LINQ to SQL函数确实插入了完整路径,因为它没有使用存储过程。

为错误道歉。