问一个利用存储过程向sql数据库写入数据的有关问题

问一个利用存储过程向sql数据库写入数据的问题
我想要做一个用户注册的网页,在网页上要用户输入用户名密码什么的,然后将他们保存到数据库中,我利用了存储过程:
CREATE   PROCEDURE   useradd  
@UID   varchar,
@UPassword   varchar,
@UPower   int,
@USex   bit,
@UCityID   int,
@Email   varchar,
@UQuestion   varchar,
@UAnswer   varchar
AS
insert   into   Users(UID,UPassword,UPower,USex,UCityID,Email,UQuestion,UAnswer)values
(@UID,
@UPassword,
2,
@USex,
@UCityID,
@Email,
@UQuestion,
@UAnswer)
GO
在程序中写的代码:
                        SqlCommand   cm   =   new   SqlCommand( "useradd ",   cn);
                        cm.CommandType   =   CommandType.StoredProcedure;
                        cm.Parameters.Add( "@UID ",   SqlDbType.VarChar);
                        cm.Parameters[ "@UID "].Value   =   TextBox_UID.Text.ToString();
                        cm.ExecuteNonQuery();
上面我省略了其他数据的输入,反正都是差不多的代码.

可是比如我在用户名中输入:qwer,写到sql数据库里面的只有第一个字符q,其他数据也是这样,只有UPower这种int类型的数据你输入20,数据库里面存储的就是20,而其他的varchar都只能存储第一个字符,这是为什么呀?

------解决方案--------------------
如果是非固定长度的数据类型,要加上长度,如:@UID varchar(20),
------解决方案--------------------
CREATE PROCEDURE useradd
@UID varchar,
@UPassword varchar,
@UPower int,
@USex bit,
@UCityID int,
@Email varchar,
@UQuestion varchar,
@UAnswer varchar
AS
insert into Users(UID,UPassword,UPower,USex,UCityID,Email,UQuestion,UAnswer)values
(@UID,
@UPassword,
2,
@USex,
@UCityID,
@Email,
@UQuestion,
@UAnswer)
GO
中varchar型得写个长度呀,如varchar(50)