webForumDet fria alternativet

Lång insert

11 svar · 416 visningar · startad av aleborg

aleborgMedlem sedan jan. 20013 341 inlägg
#1

Jag har ett formulär som innehåller ca 88 st textfält, det skulle bli en grymt lång insert-sats, kan man på nått sätt göra en loop och trycka in allt? textfälten har samma namn som databasfälten...

fredrikMedlem sedan dec. 19991 072 inlägg
#2

Ja...det bör väl inte vara spec. lurigt....

Använder du SQL-server och en SP?

I så fall kan du göra så här typ:

1. Skapa ett command-objekt mot din SP
2. Loopa igenom alla dina kontroller
3. Kontrollera aktuellt kontrolls-namn och jämför mot ditt command-objekt om namnet finns med som en parameter
4. Finns det med så lägg med parametern med aktuellt namn och värde
5. Kör din SP.

På detta sätt kan du även ha med kontroller som inte finns i databasen.

Kör du inte med SP få du loopa igenom kontrollerna och helt enkelt anta att alla ska vara med, och då skapa SQL-strängen manuellt.

        Dim Ctrl As Control
        Dim sb As New System.Text.StringBuilder("INSERT INTO Tbl (")
        For Each Ctrl In Me.Controls
            If TypeOf Ctrl Is TextBox Then
                sb.Append(Ctrl.Name)
                sb.Append(",")
            End If
        Next
        sb.Remove(sb.Length - 1, 1)
        sb.Append(") VALUES (")
        For Each Ctrl In Me.Controls
            If TypeOf Ctrl Is TextBox Then
                sb.Append("'")
                sb.Append(Ctrl.Text)
                sb.Append("',")
            End If
        Next
        sb.Remove(sb.Length - 1, 1)
        sb.Append(")")

Går även att göra bättre...men du ser mönstret iaf...

aleborgMedlem sedan jan. 20013 341 inlägg
#3

Kör C# och MySQL :D

fredrikMedlem sedan dec. 19991 072 inlägg
#4

Ok...ja då får det bli alternativ 2 då....

Du ser säkert från min VB kod hur det ser ut...

...annars kan säkert nån annan översätta...det är väldigt simpel kod...

aleborgMedlem sedan jan. 20013 341 inlägg
#5

Hmmm, får inte riktigt ihop det

StringBuilder sb = new StringBuilder("Insert Into reseller_contacts (");
foreach(Control Ctrl in this.Controls)
{
	if(Ctrl.GetType()==TextBox)
		sb.Append(Ctrl.NamingContainer+",");
}

Ctrl.Name finns inte och 'System.Web.UI.HtmlControls.HtmlInputText' denotes a 'class' where a 'variable' was expected

aleborgMedlem sedan jan. 20013 341 inlägg
#6

Här är koden jag har nu:

StringBuilder sb = new StringBuilder("Insert Into reseller_contacts (");
foreach(Control Ctrl in this.Controls)
{
	if(Ctrl is System.Web.UI.HtmlControls.HtmlInputText)
	{
		sb.Append(Ctrl.ToString());
		sb.Append(",");
	}
}
sb.Remove(sb.Length -1,1);
sb.Append(") VALUES (");
			
foreach(Control Ctrl in this.Controls)
{
	if(Ctrl is System.Web.UI.HtmlControls.HtmlInputText)
	{
		sb.Append("'");
		sb.Append(Ctrl.ToString());
		sb.Append("',");
	}
}
sb.Remove(sb.Length - 1, 1);
sb.Append(")");

Response.Write (sb.ToString());

sb.ToString() har jag satt tillfälligt eftersom inte Name kan hittas
Det här får jag ut:

Insert Into reseller_contacts ) VALUES )

någon som har ett tips?

aleborgMedlem sedan jan. 20013 341 inlägg
#7

Mitt problem är att alla textfält ligger i en table som är en server kontroll, som i sin tur ligger i en panel:
EX:

<asp:panel id="Step3" runat="server" Visible="True">
<TABLE id="contact" cellSpacing="0" cellPadding="0" border="0" runat="server">
<TR>
<TD><INPUT class="input400" id="c_company" type="text" maxLength="150" name="c_company" runat="server"></TD>
</TR>
</TABLE>
</asp:panel>

Kör jag den här koden:

foreach(Control ctrl in Step3.Controls)
{
	Response.Write(ctrl.ID + " " + ctrl.GetType().ToString() + "<br>");
}

så får jag ut:

System.Web.UI.LiteralControl
contact System.Web.UI.HtmlControls.HtmlTable

Om jag lägger inputen utanför tabellen så får jag upp den i listan, men det är tyvärr inget alternativ eftersom tabellen visas beroende på andra inställningar!

Byter jag ut "Step3.Controls" till "contact.Controls" så får jag ut

System.Web.UI.HtmlControls.HtmlTableRow

Hur löser jag det här?

DinoMedlem sedan sep. 20011 914 inlägg
#8

Här får jag fram alla textboxars värde:

<asp:Button ID="btGrr" OnClick="btGrr_Click" Text="Ta fram" Runat="server"/>
<asp:Panel ID="pnlGrr" Runat="server">
   <table>
      <tr>
         <td>
            <asp:TextBox ID="tb1" Runat="server"/>
         </td>
      </tr>
      <tr>
         <td>
            <asp:TextBox ID="tb2" Runat="server"/>
         </td>
      </tr>
      <tr>
         <td>
            <asp:TextBox ID="tb3" Runat="server"/>
         </td>
      </tr>
   </table>
</asp:Panel>
public void btGrr_Click(object sender, System.EventArgs e)
{
   foreach(Control grr in pnlGrr.Controls)
   {
      if(grr.ToString() == "System.Web.UI.WebControls.TextBox")
      {
         Response.Write(((TextBox)grr).Text + "<br/>");
      }
   }
}
aleborgMedlem sedan jan. 20013 341 inlägg
#9

Jo, men prova göra <table> till <table id="contact" cellSpacing="0" cellPadding="0" border="0" runat="server">

DinoMedlem sedan sep. 20011 914 inlägg
#10

Här får jag nu fram textboxarnas värde från koden i mitt förra inlägg.

public void btGrr_Click(object sender, System.EventArgs e)
{
   foreach(Control grr in pnlGrr.Controls)
   {
      if(grr.ToString() == "System.Web.UI.HtmlControls.HtmlTable")
      {
         for (int i=0; i<=tblHmm.Rows.Count - 1; i++)
         {
            Response.Write("<li>" + ((TextBox)tblHmm.Rows[i].FindControl("tb" + (i + 1))).Text );
         }
      }
   }
}

Fråga. Varför har du runat="server" på tabellen?

aleborgMedlem sedan jan. 20013 341 inlägg
#11

Fick det här svaret på ett annat forum:
HtmlControllerna är "Children" till tabellen och den här koden ska fungera, har dock inte testat den än:

foreach(Control ctrTopLvl in Step3.Controls) 
{ 
     Response.Write(ctrTopLvl.ID + " " + ctrTopLvl.GetType().ToString() + "<br>"); 
     foreach(Control ctrSecondLvl in ctrTopLvl.Controls) 
     { 
          Response.Write("     " + ctrSecondLvl.ID + " " + ctrSecondLvl.GetType().ToString() + "<br>"); 
     }
}
kristofferMedlem sedan juni 20001 257 inlägg
#12

aleborg skrev:

Fick det här svaret på ett annat forum:
HtmlControllerna är "Children" till tabellen och den här koden ska fungera, har dock inte testat den än:

foreach(Control ctrTopLvl in Step3.Controls) 
{ 
     Response.Write(ctrTopLvl.ID + " " + ctrTopLvl.GetType().ToString() + "<br>"); 
     foreach(Control ctrSecondLvl in ctrTopLvl.Controls) 
     { 
          Response.Write("     " + ctrSecondLvl.ID + " " + ctrSecondLvl.GetType().ToString() + "<br>"); 
     }
}

Nja, eftersom varje ctrSecondLvl också kan ha noll eller flera Controller så skall man loopa rekursivt, och inte så som du har gjort.

128 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)