C#中的本地数据库,带有存储过程

时间:2015-04-21 17:34:53

标签: c# sql-server stored-procedures

我有问题,我真的需要你的帮助。请尽快帮助我。这是我的故事。我在Visual Studio中为我的项目创建了一个本地数据库。我的意思是我右键单击我的项目并选择添加并将服务基础数据库添加到名为OCRDataBase的项目中。

我的第一个问题是:我在Visual Studio的Server Explorer菜单中为我的数据库创建了这个存储过程

CREATE PROCEDURE [dbo].[CheckDataBase]
    @Shape int ,
    @p1 int ,
    @p2 int ,
    @p3 int ,
    @p4 int ,
    @output nvarchar(10) out
as
Begin
    select 
        @output = [Character] 
    from 
        dbo.OCRTable 
    where 
        Style = @Shape 
        and Part1 = @p1 and Part2 = @p2 and Part3 = @p3 and Part4 = @p4;

    if(@output is null)
        select @output = '[Unknown]';
End

我有一个包含6列(id, style, part1, part2, part3, part4,字符)的表。

这个存储过程应该返回字符,如果没有任何字符与存储过程条件相匹配,它会返回' [Unknown]';

我在Visual Studio中编写此函数以获取此存储过程返回的值

static public string Check(int Shape, int p1, int p2, int p3, int p4)
{
            string FunctionOutput = "";

            try
            {
                Connection.Open();
                SqlCommand SqlCommands = new SqlCommand("[dbo].[CheckDataBase]", Connection);
                SqlCommands.CommandType = CommandType.StoredProcedure;
                SqlCommands.Parameters.AddWithValue("@Shape", Shape);
                SqlCommands.Parameters.AddWithValue("@p1", p1);
                SqlCommands.Parameters.AddWithValue("@p2", p2);
                SqlCommands.Parameters.AddWithValue("@p3", p3);
                SqlCommands.Parameters.AddWithValue("@p4", p4);

                SqlParameter OutputParameter = new SqlParameter();
                OutputParameter.ParameterName = "@output";
                OutputParameter.SqlDbType = SqlDbType.NVarChar;
                OutputParameter.Direction = ParameterDirection.Output;
                SqlCommands.Parameters.Add(OutputParameter);

                SqlCommands.ExecuteNonQuery();
                FunctionOutput = OutputParameter.Value.ToString();
                MessageBox.Show(FunctionOutput);
            }
            catch (SqlException exception)
            {
                MessageBox.Show(exception.ToString());
            }
            finally
            {
                Connection.Close();
            }
            return FunctionOutput;
}

但是当SqlCommand.ExecuteNonQuery();执行时,会显示以下消息:

  

未处理的类型' System.InvalidOperationException'发生在System.Data.dll

中      

附加信息:String [5]:Size属性的大小无效。

我该怎么办?请帮帮我。

我的第二个问题是如何为该数据库提供相对地址,以便我可以从任何文件夹和任何计算机运行我的应用程序。

这是我的数据库连接:

static private SqlConnection Connection = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=D:\Modem Project\PROJECT\OCR\OCR\OCRDataBase.mdf;Integrated Security=True");

我尝试写

..\..\OCRDataBase.mdf instead of  D:\Modem Project\PROJECT\OCR\OCR\OCRDataBase.mdf

但这是Visual Studio消息:

  

此文件夹中已存在具有该名称的数据库。

似乎Visual Studio想要替换它。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

根据MSDN

  

对于具有可变长度类型的输出参数(nvarchar,for   例如),参数的大小定义了缓冲区的大小   保持输出参数。输出参数可以截断为   用Size指定的大小。对于字符类型,指定的大小   大小以字符为单位。

在您的情况下,您尝试从存储过程返回nvarchar,因此请尝试设置这样的大小,

SqlParameter OutputParameter = new SqlParameter();
OutputParameter.ParameterName = "@output";
OutputParameter.SqlDbType = SqlDbType.NVarChar;
OutputParameter.Direction = ParameterDirection.Output;
OutputParameter.Size = 10;
SqlCommands.Parameters.Add(OutputParameter);