首先是表设计:create table Page
(
PageID int identity(1, 1) not null primary key,
PageUrl nvarchar(500) not null,
PageTitle nvarchar(100) not null,
CountOfClick int not null default 0
);然后是c#:
            SqlConnection conn = null;
            SqlCommand cmd = null;            try
            {
                conn = new SqlConnection("Data Source=localhost;Initial Catalog=Test;Integrated Security=SSPI;");
                conn.Open();
                cmd = conn.CreateCommand();
                cmd.CommandText = "insert into Page(PageUrl, PageTitle, CountOfClick) values(@PageUrl, @PageTitle, @CountOfClick)";
                cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@PageUrl", page.PageUrl));
                cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@PageTitle", page.PageTitle));
                cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@CountOfClick", 0));
                cmd.ExecuteNonQuery();     //【注意】这里报错:参数化查询 '(@PageUrl nvarchar(13),@PageTitle nvarchar(10),@CountOfClick big' 需要参数 '@CountOfClick',但未提供该参数。                return true;
            }
            catch
            {
                return false;
            }
            finally
            {
                if (cmd != null)
                {
                    cmd.Dispose();
                }
                if (conn != null)
                {
                    conn.Close();
                    conn.Dispose();
                }
            }

解决方案 »

  1.   

    还有个问题我请教一下,我插入@CountOfClick的值为0,在c#里面是int(Int32),但是我把参数添加到cmd.Parameter里面以后,发现这个参数的DbType是Int64,并且SqlDbType是BigInt。
    哪位解释一下。
    谢谢。
      

  2.   

    在cmd.ExecuteNonQuery()这里报错:
    参数化查询 '(@PageUrl nvarchar(13),@PageTitle nvarchar(10),@CountOfClick big' 需要参数 '@CountOfClick',但未提供该参数。
      

  3.   

    既然有默认值,就不要把默认值那个字段作为参数传递,把sql语句改成
    cmd.CommandText = "insert into Page(PageUrl, PageTitle, CountOfClick) values(@PageUrl, @PageTitle, default)";
    然后把  cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@CountOfClick", 0));这句删掉
    就行了
      

  4.   

    那如果我插入的值和默认值不一样呢。问题的关键不在有没有默认值。
    我把字段CountOfClick改成没有默认值,按照我顶楼的代码插入还是报同样的错。
      

  5.   

                string PageUrl = "http://www.baidu.com";
                string PageTitle = "百度";
                int defaultnum = 0;
                string connstr = @"Data Source=.;DataBase=StudentManage;User ID=sa;Password=abc12345";
                SqlConnection conn = null;
                SqlCommand cmd = null;            try
                {
                    conn = new SqlConnection(connstr);
                    conn.Open();
                    cmd = conn.CreateCommand();
                    cmd.CommandText = "insert into Page(PageUrl, PageTitle, CountOfClick) values(@PageUrl, @PageTitle, @CountOfClick)";
                    cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@PageUrl", PageUrl));
                    cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@PageTitle", PageTitle));
                    cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@CountOfClick", defaultnum));
                    cmd.ExecuteNonQuery();     //【注意】这里报错:参数化查询 '(@PageUrl nvarchar(13),@PageTitle nvarchar(10),@CountOfClick big' 需要参数 '@CountOfClick',但未提供该参数。                return true;
                }
                catch
                {
                    return false;
                }
                finally
                {
                    if (cmd != null)
                    {
                        cmd.Dispose();
                    }
                    if (conn != null)
                    {
                        conn.Close();
                        conn.Dispose();
                    }
                }试了一下,这样不会出错
      

  6.   

    chinajiyong,我试了一下,如果用一个int变量defaultnum,的确不会报错,如果不用变量,cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@CountOfClick", 0));,这样就会报错。我调试的时候看了一下,如果用变量,那么new出来的这个SqlParameter的DbType为Int32,SqlDbType为Int;如果不用变量,那么DbType是Int64,SqlDbType是BigInt。