Avatar billede simsen Mester
01. august 2011 - 19:05 Der er 6 kommentarer og
1 løsning

Datatype text virker ikke fra Asp.Net

Hej,

Jeg har et felt i en database, som jeg har lavet til data type text. Nu vil jeg så indsætte fra asp.net (C#) en tekst i den post i tabellen som fylder 44.043 tegn (optalt i word) og den gør det bare ikke :-(

Jeg opretter stored procedure gennem asp.net:

//Version 1.0
    //New post
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void NewPost(int topicId, string UserId, DateTime createDate, string post, bool isApproved, bool isTopicPost)
    {
        SqlConnection conn = new SqlConnection("Context Connection=true");
        SqlCommand cmd = new SqlCommand();

        cmd.Connection = conn;

        cmd.Parameters.Add(new SqlParameter("@topicId", topicId));
        cmd.Parameters.Add(new SqlParameter("@UserId", UserId));
        cmd.Parameters.Add(new SqlParameter("@createDate", createDate));
        cmd.Parameters.Add(new SqlParameter("@post", SqlDbType.Text));
        cmd.Parameters["@post"].Value = post;
        //cmd.Parameters.Add(new SqlParameter("@post", post));
        cmd.Parameters.Add(new SqlParameter("@isApproved", isApproved));
        cmd.Parameters.Add(new SqlParameter("@isTopicPost", isTopicPost));

        cmd.CommandText = @"DECLARE @v_postId AS INTEGER
BEGIN
INSERT INTO Forum_Post
(
topicId,
UserId,
createDate,
post,
isApproved,
isTopicPost

VALUES
(
@topicId,
@UserId,
@createDate,
@post,
@isApproved,
@isTopicPost
)
SET @v_postId = @@IDENTITY
END
SELECT @v_postId AS postId";

        conn.Open();

        SqlDataReader rdr = cmd.ExecuteReader();
        SqlContext.Pipe.Send(rdr);

        rdr.Close();
        conn.Close();
    }

Som I kan se, så definerer jeg post til at være af datatypen text - men når jeg sætter ind - så laver den ingen fejl - den hakker bare alt af efter ca. 3.900 tegn.

Når jeg så forsøger at køre selve stored procedure (med execute stored procedure) fra MS Server Management Studio, kan jeg se, at den ændrer feltet til en nvarchar
Parameter Data Type
@topicId int
@UserId nvarchar(4000)
@createDate datetime
@post nvarchar(4000)
@isApproved bit
@isTopicPost bit

Hvad er det jeg skriver forkert i ovennævnte kode?

mvh
simsen :-)
Avatar billede Syska Mester
01. august 2011 - 19:16 #1
Hej,

Kig på Sqlfacet:

[SqlFunction(DataAccess = DataAccessKind.None)]
public static String Trim([SqlFacet(MaxSize = -1)]String value)
{
    return value.Trim();
}

Håber det virker.

mvh
Avatar billede arne_v Ekspert
01. august 2011 - 19:26 #2
Hvorfor have den SP?

Var det ikke nemmere bare at kalde en simple INSERT med parametre?
Avatar billede simsen Mester
01. august 2011 - 19:35 #3
Hej Buzzzz,

Vil du have jeg skriver det der i min clr - altså der hvor jeg skriver stored procedure?

Og når jeg har dig - jeg er lidt opgivende lige nu - og det må jeg ikke være - det her felt kan bare ikke nøjes med 4000 tegn.

Jeg forsøgte at lave stored procedure direkte i SQL Management studio (i stedet for at skrive den i asp.net) - og så¨indsatte jeg via asp.net i tabellen.....Det gik fint og jeg blev rigtig rigtig glad....altså indtil jeg ville slette min række i Management studio -  nu får jeg følgende fejl; string or binary data would be truncated. the statement has been terminated

Jeg er fuldstændig ligeglad med hvilken datatype feltet har - jeg har bare brug for at kunne sætte minimum 15000 tegn ind i det pågældende felt. Og feltet skal også kunne opdateres og slettes. Jeg er også ligeglad med om jeg skal have en enkelt stored procedure, jeg skal oprette direkte i management studio.

Husk du taler med it analfabeten (altså når jeg spørger herinde)...så er det fordi jeg ikke har kunnet google mig til noget, jeg fatter en meter af :-)
Avatar billede simsen Mester
01. august 2011 - 19:39 #4
Hej arne :-)

Læs mit svar til Buzzzz. Jeg har forsøgt bare at lave stored procedure i SQL Management Studio og så kalde den fra min asp.net kode med parametre:

public int NewPost(int topicId, string UserId, DateTime createDate, string post, bool isApproved, bool isTopicPost)
        {
            DAL.AddParameter("@topicId", topicId);
            DAL.AddParameter("@UserId", UserId);
            DAL.AddParameter("@createDate", createDate);
            DAL.AddParameter("@post", post);
            DAL.AddParameter("@isApproved", isApproved);
            DAL.AddParameter("@isTopicPost", isTopicPost);

            return postId = Convert.ToInt32(DAL.ExecuteScaler("NewPostXX", CommandType.StoredProcedure));
        }

Og ja ja - jeg er rigtig "kvik" - så har bare lavet en test storedprocedure, jeg har kaldt NewPostXX.

Som skrevet - nu smider den det hele ind i feltet - men nu kan jeg ikke få lov til at slette rækken - eller ændre den (jeg var naiv og troede, jeg bare kunne ændre feltet med tre tegn og så slette den efterfølgende).
Avatar billede simsen Mester
01. august 2011 - 19:51 #5
Hmmmm

Synes altså den er underlig.....

Hvis jeg laver storedprocedures til insert og update (håber jeg - update er ikke testet endnu) direkte i SQL management studio og så tilgår disse istedet for at lave storedprocedure via asp.net, så får jeg det til at spille.

Jeg kan så ikke slette felterne direkte i SQL management studio....det skal jeg gøre fra asp.net.....

Nå skidt pyt - skal bare have noget til at fungere - og det gør ovennævnte.

Tak fordi I endnu engang gad spare med mig. Bare smid et svar og I får lov til at dele pointsene :-)
Avatar billede simsen Mester
01. august 2011 - 19:57 #6
Hov Arne,

Du spurgte hvorfor jeg har den storedprocedure - jeg elsker at arbejde med dem og helst fra asp.net - fordi her skal jeg så ikke huske på, hvis jeg laver en ændring i en af dem. Jeg får alle ændringer (altså mht. stored procedure) med over, når jeg smider det over i produktion fra test. Jeg har skam også et projekt, hvor jeg arbejder med almindelige tekst strenge (med parameters selvfølgelig), hvor jeg inserter osv. og de er ikke nær så overskuelige som stored procedures (altså i mine øjne) :-)

Det er så et andet emne, jeg på et tidspunkt gerne vil have hjælp til.....Lige nu skriver jeg ned på en liste, hvis jeg laver en ændring i en tabel, som jeg så skal ændre i produktionsdatabasen, når jeg smider den nye version over...Synes det er for omstændigt, der må findes en lettere løsning :-)
Avatar billede Syska Mester
01. august 2011 - 19:58 #7
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester