Källkoden för /anders.enges/asp/dbins.asp

<!--#include file="../inc/navstuff.asp" -->
Insättning av nya poster kräver några modifieringar i tabellhanteringen från tidigare
exempel.<p>
Den största skillnaden är att vi hitintills öppnat tabellen som <b>ReadOnly</b> vilket inte
tillåter insättningar eller ändringar. Man bör dock beakta att det är snabbare att lista
en ReadOnly, ForwardOnly tabell än en som tillåter förändringar. Man bör därför alltid öppna
tabeller så enkelt som möjligt.<p>
För insättingar duger dock inte ReadOnly. Följande "öppningsprocedur" skall användas:
<div class=code>
<FONT COLOR=#006400><!-- #include file="connection.asp" --></font><br>
<span class=asp>
<%<br>
' SQL satsen för tabellen<br>
<i>SQL</i> = "SELECT * FROM <i>TABELLNAMN</i>"<br>
Set <i>Conn</i> = Server.CreateObject("ADODB.Connection")<br>
<i>Conn</i>.Open <i>strConn</i><br>
Set <i>RS</i> = Server.CreateObject("ADODB.RecordSet")<br>
' Måste öppna ett recordset för uppdatering - 2 eller 3 som sista<br>
' parameter<br>
<i>RS</i>.Open <i>SQL</i>, <i>Conn</i>, <b>1</b>, <b>3</b><br>
</span></div><p>
I raden <span class=asp><i>RS</i>.Open <i>SQL</i>, <i>Conn</i>, <b>1</b>, <b>3</b></span>
betyder 1:an att vi öppnar tabellen som KeySet (jag tänker inte gå in på vad detta exakt betyder, bara
konstatera att det brukar vara den bästa i denna situation).<p>
3:an betyder att vi vill använda s.k. <I>Optimistic Locking</i> vilket betyder att
ADO låser posten så sent som möjligt före <b>Update</b>. <p>
Ett annat alternativ skulle kunna vara 2 som ger oss <I>Pessimistic Locking</i>. Detta betyder att posten låses
så fort vi börjar göra någonting.<p>
I detta sammanhang då vi vill skapa en post, sätta dit värden och spara duger Optimistic (3) bra...<p>
Vi kan efter att ha öppnat tabellen med ovanstående metod göra följande<br>
<div class=code>
<span class=Asp>
<%<br>
<i>RS</i>.AddNew<br>
<i>RS</i>("<i>FÄLT1</i>") = <i>Värde1</I><br>
<i>RS</i>("<i>FÄLT2</i>") = <i>Värde2</I><br>
<i>RS</i>("<i>FÄLT3</i>") = <i>Värde3</I><br>
<i>RS</i>.Update<br>
<br>
<i>RS</i>.Close<br>
<i>Conn</i>.Close<br>
Set <i>RS</i> = Nothing<br>
Set <i>Conn</i> = Nothing<br>
%><br>
</span>
</div><p>
Fullt så enkelt är det dock inte alltid.<p>
Vad händer till exempel vid följande kod om fältet är numeriskt?
<div class=code>
<span class=Asp>
<%<br>
<i>RS</i>.AddNew<br>
<i>RS</i>("<i>NUMMERFÄLT</i>") = "TEST"<br>
<i>RS</i>.Update<br>
%><br>
</span>
</div><p>
Eller vid följande om fältet inte har "<b>Allow Zero Length</b>" satt?
<div class=code>
<span class=Asp>
<%<br>
<i>RS</i>.AddNew<br>
<i>RS</i>("<i>TEXTFÄLT</i>") = ""<br>
<i>RS</i>.Update<br>
%><br>
</span>
</div><p>
För att inte tala om det största problemet:
<div class=code>
<span class=Asp>
<%<br>
<i>RS</i>.AddNew<br>
<i>RS</i>("<i>DATUMFÄLT</i>") = "12.1.1999"<br>
<i>RS</i>.Update<br>
%><br>
</span>
</div><p>
Om vi tar det sista problemet först så kan vi konstatera att den 12 januari år 1999 kan skrivas som<ul>
<li>12.1.1999
<li>1.12.1999
<li>1999.1.12
<li>1999.12.1
<li>12.1999.1
<li>1.1999.12
<li>Och dessutom kan det vara . eller / eller något annat tecken mellan de olika delarna
<li>Och sedan kan vi ju börja fundera på om år skall ha två eller fyra sifror.
</ul><p>
I en ideal värld har vi följande:<ul>
<li>Användaren av programmet är finsk
<li>Sidan har LCID=2077 eller 1035 för att säga att den är finlandssvensk eller finsk
<li>Databassystemet är inställt för finsk standard
<li>Serverdatorn har finska inställningar
</ul>
<p>
Om samtliga dessa villkor är uppfyllda så är det inga problem, men...<p>
Det är inte alltid t.ex. servern har korrekta inställningar och då får vi PROBLEM!<p>
Det verkar dock som om det alltid går att använda datering enligt amerikanskt
system oavsett hur datorn är inställd. Detta betyder att vi alltid skall ange datum
i formen mm/dd/yyyy alltså månad dag och år<p>

Det svåra är att avgöra vad som kan betraktas som fel. Man skulle kunna tänka sig
att sätta in en nolla (0) om en siffra inte är giltig, eller Null.
I ovanstående funktion så returneras false, man är det rätt i alla situationer?<p>

Detta är en betydligt större fråga än vad ni kanske tänkt på...<p>
Är ni bra på SQL kan även följande instättningsmetod användas<br>
<div class=code>
<span class=Asp>
' ...<br>
<i>strSQL</i> ="INSERT INTO <i>TABELL</i> " <br>
<i>strSQL</i> = <i>strSQL</i> & " (<i>FÄLT1</i>, <i>FÄLT2</i>,<i>NÄR</i>)"<br>
<i>strSQL</i> = <i>strSQL</i> & " VALUES ("<br>
<i>strSQL</i> = <i>strSQL</i> & <i>värde1</i> & ", " <br>
<i>strSQL</i> = <i>strSQL</i> & <i>värde2</i> & ", " <br>
<i>strSQL</i> = <i>strSQL</i> & "NOW" & ")" <br>
Conn.Execute strSQL<br>
' ...<br>
</span>
</div><p>
Det är denna metod jag själv använder mest. Jag har dock märkt att mina
elever ofta slarvar bort sig när de skall börja skarva ihop långa teckensträngar...<p>
<!--#include file="../inc/footer.asp" -->